백준 20055 컨베이어 벨트 위의 로봇 / python

이유참치·2026년 3월 3일

백준

목록 보기
226/249

문제 : 20055

풀이 point

문제가 꽤 이해가 안될 수 있다. 가장 중요한점은 위에 컨베이어 벨트만 박스가 올라가고 밑에 컨베이어벨트는 박스가 올라가지 않는다. 컨베이어 벨트가 회전하면 말 그대로 회전이기 때문에 칸 자체의 내구도가 한칸 씩 밀린다.

ex)

- - - - - 위 (박스 가능, 첫번째 칸에는 박스 올림, 마지막 칸에는 박스 내림)
- - - - - 아래 (박스 없음, 컨베이어 벨트는 회전함)

문제에서는
1. 컨베이어 벨트가 회전하고(로봇은 그대로)
2. 로봇이 한칸 씩 옆으로 이동한다.(내구도 check, 이때 위 컨베이어 벨트의 끝에 도착했다면 로봇이 내려감)

원형큐처럼 생각하고 돌리면 된다. 아마 queue를 활용하면 편하겠지만 리스트로도 가능은 하다.

문제에 나와있는 순서대로 구현하면 된다.

풀이 코드

N, K = map(int, input().split())

box = list(map(int, input().split()))

upBox = [0]*N
downBox = [0]*N
for i in range(N):
  upBox[i] = [box[i], False]

for i in range(N):
  downBox[i] = [box[N+i], False]

time= 0
while True:
  time += 1

  if upBox[N-1][1]: #끝에 로봇 내리기
    upBox[N-1][1] = False
  
  upLast = upBox[N-1][0]

  for i in range(N-1, 0, -1): #위쪽 돌리기
    upBox[i][1] = upBox[i-1][1]
    upBox[i][0] = upBox[i-1][0]
  
  if upBox[N-1][1]: #끝에 로봇 내리기
    upBox[N-1][1] = False
  
  downLast = downBox[N-1][0]

  for i in range(N-1, 0, -1): #아래쪽 돌리기
    downBox[i][0] = downBox[i-1][0]

  upBox[0][0] = downLast
  downBox[0][0] = upLast
  upBox[0][1] = False

  for i in range(N-1, 0, -1): #위쪽 돌리기
    if not upBox[i][1] and upBox[i-1][1] and upBox[i][0] != 0:
      upBox[i-1][1] = False
      upBox[i][1] = True
      upBox[i][0] -= 1

  if upBox[0][0] != 0 and not upBox[0][1]: #박스 올리기
    upBox[0][1] = True
    upBox[0][0] -= 1
  
  if upBox[N-1][1]: #끝에 로봇 내리기
    upBox[N-1][1] = False
  
  k = 0
  for i in range(N):
    if upBox[i][0] == 0:
      k += 1
    if downBox[i][0] == 0:
      k+=1
  if k >= K:
    break

print(time)
profile
임아리 - 대학생

0개의 댓글