barcode

백준 10810번 풀이

BOJ/[BOJ] Python

문제

https://www.acmicpc.net/problem/10810

 

10810번: 공 넣기

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 가장 처음 바구니에는 공이

www.acmicpc.net

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

 

풀이

일단 이 문제에서는 공의 개수를 보는 게 아니라, 공의 번호를 본다. 그래서 문제에서 바구니에 넣는 게 공의 번호이지 공 개수가 아니다. 즉 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