풀이


총 4가지 구현을 반복적으로 수행하다 내구도가 0 인 칸이 K 에 도달했을 경우까지의 단계를 출력하는 문제이다.

  1. 컨베이어 벨트가 이동하고 그 위의 로봇 역시 이동하기에 두 리스트 모두 수정해준 후 내리는 위치에 로봇이 도달했을 경우 해당 위치의 로봇을 제거해준다.

  2. robot 리스트를 거꾸로 순회하면서 전진이 가능할 경우 로봇을 한칸 이동시켜준다. 마찬가지로 로봇이 내리는 위치에 도달했을 경우 해당 위치의 로봇을 제거해준다.

  3. 로봇이 올리는 위치에 생성된다. 이때 내구도가 0 이라면 생성하지 않는다.

  4. 위 모든 과정이 끝난 후 내구도가 0 인 칸이 K 개 이상이라면 반복문을 탈출하고 cnt 를 출력하고 K 개보다 적다면 다시 반복한다.

위 모든 과정을 while문에 담고 cnt 가 K 를 초과할 경우에 반복문을 탈출하면서 cnt 를 출력해주면된다.

소스코드


# 컨베이어 벨트 위의 로봇
import sys
input = sys.stdin.readline
 
n, k = map(int, input().split())
robot = [0] * n
belt = list(map(int, input().split()))
cnt = 1
 
while True:
    # 1
    b = belt.pop()
    r = robot.pop()
    belt.insert(0, b)
    robot.insert(0, r)
    robot[n-1] = 0
 
    # 2
    for i in range(n-1, 0, -1):
        if robot[i] == 0 and belt[i] > 0 and robot[i-1] == 1:
            robot[i] = 1
            belt[i] -= 1
            robot[i-1] = 0
    robot[n-1] = 0
 
    # 3
    if belt[0] != 0:
        robot[0] = 1
        belt[0] -= 1
 
    # 4
    if belt.count(0) >= k:
        print(cnt)
        break
    cnt += 1

References