이 문제는 삼성 기출이라는데, 문제를 이해하기가 매우 까다로웠다.. 끅
import sys
from collections import deque
n, k = map(int, sys.stdin.readline().split())
belt = deque(list(map(int, sys.stdin.readline().split()))) # A 각 자리의 내구도
robot = deque([0]*n) # 로봇의 위치
ans = 0
while True:
# 1 _ 한칸씩 오른쪽으로 회전
belt.rotate(1)
robot.rotate(1)
robot[-1] = 0 # 로봇 내려가는 지점에서는 항상 0
# 2 _ 로봇이 존재하면, 로봇 자체 이동
if sum(robot):
for i in range(n-2,-1,-1):
if robot[i] == 1 and robot[i+1] == 0 and belt[i+1] >= 1:
robot[i+1] = 1
robot[i] = 0
belt[i+1] -= 1
robot[-1] = 0
# 3 _ 올리는 위치 내구도 0이 아니면 로봇 올림.
if robot[0] == 0 and belt[0] >= 1:
robot[0] = 1
belt[0] -= 1
ans += 1
# 4 _ 내구도 0인 칸 k개 이상인지 확인
if belt.count(0) >= k:
break
print(ans)
중간에 for i in range(n-2,-1,-1)
으로 돌리는데,
다음 칸 (i+1)칸에 대한 영향을 받게 하지 않게 하기 위해 역순으로 탐색한다는 것이 주목할 만 하다.