https://www.acmicpc.net/problem/20055
"""
"""
from collections import deque
N, K = map(int, input().split())
duration = deque(map(int, input().split())) # 내구성 정보
robot = deque([-1] * N) # 로봇의 움직임 - 로봇이 있을 때 0, 로봇이 없을 때 -1
step = 0 # 단계
while True:
step += 1 # 단계가 진행할 때 마다 +1
# 1. 벨트가 각 칸위에 있는 로봇과 함께 회전한다.
duration.rotate()
robot.rotate()
# 1-1. 이때 로봇이 내리는 위치에 도착하면 내린다.
if robot[-1] == 0:
robot[-1] = -1
# 2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
# 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
for i in range(N-2, -1, -1):
if robot[i] == 0:
if robot[i+1] == -1 and duration[i+1] >= 1:
duration[i+1] -= 1
robot[i+1] = 0
robot[i] = -1
# 2-1. 이때 로봇이 내리는 위치에 도착하면 내린다.
if robot[-1] == 0:
robot[-1] = -1
# 3. 만약 1번 벨트의 내구성이 1이상이면 로봇을 1번 위치에 올리고, 1번 벨트의 내구성을 1 감소 시킨다.
if duration[0] >= 1 and robot[0] == -1:
robot[0] = 0
duration[0] -= 1
if duration.count(0) >= K: # 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
break
print(step)
문제 설명대로 단순히 구현하면 쉽게 풀 수 있음.
deque()의 rotate() 정도 배워갈 수 있음.