

각 칸의 내구도를 저장하는 A_list와 로봇의 유무를 저장하는 robot_list 구현 시 리스트 대신 deque로 구현하면 .rotate(1)을 사용하여 오른쪽으로 1칸 회전을 쉽게 할 수 있음
- .rotate(-1)은 왼쪽으로 1칸 회전
from collections import deque
n, k = map(int, input().split())
A_list = deque(map(int, input().split()))
robot_list = deque([0] * (n))
count_loop = 0
while True:
# 1) 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
A_list.rotate(1) # deque의 .rotate()를 사용하여 오른쪽으로 1칸 회전
robot_list.rotate(1)
'''
temp = A_list[0]
for i in range(2 * n - 1, -1, -1):
# 내구도 이동
if i == (2 * n - 1):
A_list[0] = A_list[i]
elif i == 0:
A_list[1] = temp
else:
A_list[i + 1] = A_list[i]
# 로봇 이동
if 0 <= i <= n - 2:
if robot_list[i] == 1:
robot_list[i] = 0
robot_list[i + 1] = 1
'''
# 회전 후 내리는 칸은 로봇 비우기
robot_list[-1] = 0
# 2) 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
# 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
for i in range(n - 2, -1, -1):
if robot_list[i] == 1 and robot_list[i + 1] == 0 and A_list[i + 1] >= 1:
robot_list[i] = 0
robot_list[i + 1] = 1
if A_list[i + 1] > 0:
A_list[i + 1] -= 1 # 로봇 이동 시 즉시 내구도 1 감소
# 내리는 칸은 로봇 비우기
robot_list[-1] = 0
# 3) 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
if A_list[0] > 0:
robot_list[0] = 1
A_list[0] -= 1 # 로봇 올리고 즉시 내구도 1 감소
count_loop += 1
# 4)내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
if A_list.count(0) >= k:
break
print(count_loop)