[ BOJ / Python ] 20055번 컨베이어 벨트 위의 로봇


이번 문제는 deque를 이용하여 해결하였다. 우선 조건대로 deque의 rotate()함수를 이용하여 벨트와 로봇을 한칸씩 이동시키고, n-1인덱스에 위치하는 로봇을 없애준다. 그리고 로봇 리스트를 뒤에서부터 순회하며 다음 칸에 로봇이 없고 다음 칸의 내구도가 0보다 클 때에만 로봇을 한칸 이동시켜준다. 이때에도 로봇이 n-1인덱스에 위치하게 될 수 있으므로 n-1위의 로봇을 없애준다. 그리고 올리는 위치에 로봇이 없고, 올리는 위치의 내구도도 0보다 크다면 로봇을 하나 올려준다.

  • n, k를 입력받는다.
  • 컨베이어 벨트의 내구도를 저장할 리스트 belt를 deque로 선언한다.
  • 로봇의 위치를 저장할 리스트 robot을 deque로 선언한다.
  • 정답을 저장할 변수 answer를 0으로 선언한다.
  • while문을 돌린다.
    -> belt를 1 방향으로 rotate한다.
    -> robot을 1 방향으로 rotate한다.
    -> robot[-1]을 0으로 갱신한다.
    -> n-2부터 0까지 감소하는 i에 대한 for문을 돌린다.
    --> 만약 robot[i]가 1일 경우,
    ---> 만약 robot[i+1]이 0이고, belt[i+1]이 0보다 클 경우,
    ----> robot[i]robot[i+1]을 0과 1로 갱신한다. (로봇의 이동)
    ----> belt[i]를 1 감소시킨다. (로봇의 이동으로 인한 내구도 감소)
    -> robot[-1]을 0으로 갱신한다.
    -> 만약 belt[0]이 0보다 크고, robot[0]이 0일 경우,
    --> robot[0]을 1로 갱신한다.
    --> belt[0]을 1 감소시킨다.
    -> answer를 1 증가시킨다.
    -> 만약 belt에 0의 갯수가 k 이상일 경우,
    --> while문을 종료한다.
  • answer를 출력한다.

Code

from collections import deque
n, k=map(int, input().split())
belt=deque(list(map(int, input().split())))
robot=deque([0]*n)
answer=0
while True:
    belt.rotate(1)
    robot.rotate(1)
    robot[-1]=0
    for i in range(n-2, -1, -1):
        if robot[i]==1:
            if robot[i+1]==0 and belt[i+1]>0:
                robot[i], robot[i+1]=0, 1
                belt[i+1]-=1
    robot[-1]=0
    if belt[0]>0 and robot[0]==0:
        robot[0]=1
        belt[0]-=1
    answer+=1
    if belt.count(0)>=k:
        break
print(answer)

좋은 웹페이지 즐겨찾기