백준 10810번 풀이

문제

바구니 안에 공 뭐 들었나 최종적으로 출력하면 된다.

풀이

일단 이 문제에서는 공의 개수를 보는 게 아니라, 공의 번호를 본다. 그래서 문제에서 바구니에 넣는 게 공의 번호이지 공 개수가 아니다. 즉 1 2 3 <<이건 1번 바구니부터 2번 바구니까지 3번 공을 넣어라 이거. 그리고 공이 바구니에 들어가있으면 꺼내고 새 공을 넣는 방식이다.

import sys 
N, M = map(int,sys.stdin.readline().split())
basket = list(range(N))
for i in basket:
    basket[i] = 0
# 리스트를 0으로 채운다

일단 바구니를 만들어보자. N이 바구니의 개수이고, M은 공을 몇 번 넣을지 정하는거다.

for i in range(M): 
    i, j, k = map(int, sys.stdin.readline().split())

그럼 여기까지 하면 입력은 됐고, 로직을 짜야 하는데… 여기서 중요한 게 있다. 간과하고 넘어가면 여러분들 코딩 다 짰다 로직 돌리자 하는 순간

빰빠바밤~ 빰 빰 빰 빰 빰 빰빠바밤~ 빰 빠아아아암~~~ 함정카드 발투더동!

컴퓨터는 0부터 센다. 사람은 1부터 센다. 그러니까 사람 입장에서 1번 바구니는 첫번째 바구니이고, 컴퓨터 입장에서 1번 바구니는 두번째 바구니이다. 그러면 여러분에게는 선택지가 두 개 있는데, 첫번째로 사람 인덱스에 맞추는 방법(바구니 배열 길이는 +1되지만 0번째 배열을 안 쓰기때문에 잘라야 한다)이 있고 두번째로 컴퓨터 인덱스에 맞춰서 range를 계산하는 방법이 있다. 이번 정답은 후자의 방법을 썼다.

for i in range(M): 
    i, j, k = map(int, sys.stdin.readline().split())
    for m in range(i, j+1):
        basket[m] = k

전자는 이렇게 하는 대신 바구니 길이가 N+1이 된다.

for i in range(M): 
    i, j, k = map(int, sys.stdin.readline().split())
    for m in range(i-1, j):
        basket[m] = k

후자는 바구니 길이는 그대로인 대신 앞에 범위에서 하나를 빼야 한다. (1 2 3이면 시작이 0부터이고 range는 n 미만이니까 0부터 1까지 3번공을 넣는다)

import sys 
N, M = map(int,sys.stdin.readline().split())
basket = list(range(N))
for i in basket:
    basket[i] = 0
# 리스트를 0으로 채운다 

for i in range(M): 
    i, j, k = map(int, sys.stdin.readline().split())
    for m in range(i-1, j):
        basket[m] = k

print(*basket)

리스트를 출력할 때 앞에 애스터리스크(*)를 붙이면 알아서 언패킹해준다. 그니까 [] 안에 들어있는 걸 알아서 빼서 출력해달라는 옵션같은거다.

import sys 
N, M = map(int,sys.stdin.readline().split())
basket = list(range(N))
for i in basket:
    basket[i] = 0
# 리스트를 0으로 채운다 

for i in range(M): 
    i, j, k = map(int, sys.stdin.readline().split())
    for m in range(i-1, j):
        basket[m] = k

for i in basket:
    print(i,end=" ")

아잇 저는 그런 고급진 스킬 몰라여! 그러면 반복문으로 빼슈… 리스트 길이를 늘렸다고?

import sys 
N, M = map(int,sys.stdin.readline().split())
basket = list(range(N+1))
for i in basket:
    basket[i] = 0
# 리스트를 0으로 채운다 

for i in range(M): 
    i, j, k = map(int, sys.stdin.readline().split())
    for m in range(i, j+1):
        basket[m] = k

print(*basket[1:])

슬라이싱하고 언패킹하슈.

import sys 
N, M = map(int,sys.stdin.readline().split())
basket = list(range(N+1))
for i in basket:
    basket[i] = 0
# 리스트를 0으로 채운다 

for i in range(M): 
    i, j, k = map(int, sys.stdin.readline().split())
    for m in range(i, j+1):
        basket[m] = k

for i in basket[1:]:
    print(i, end=" ")

근데 이건 왜 되는거임???

아, 근데 길이를 늘렸을 때에 대해서는 VScode로 테스트는 해봤는데 제출은 못했다. (본인은 인덱스를 컴퓨터에 맞췄다) 참고하시길.