문제
https://www.acmicpc.net/problem/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로 테스트는 해봤는데 제출은 못했다. (본인은 인덱스를 컴퓨터에 맞췄다) 참고하시길.
'BOJ > [BOJ] Python' 카테고리의 다른 글
백준 10811번 풀이 (0) | 2023.05.28 |
---|---|
백준 10813번 풀이 (0) | 2023.05.28 |
백준 25314번 풀이 (0) | 2023.05.28 |
백준 11382번 풀이 (0) | 2023.05.28 |
백준 2587번 풀이 (0) | 2022.11.15 |