문제가 꽤 이해가 안될 수 있다. 가장 중요한점은 위에 컨베이어 벨트만 박스가 올라가고 밑에 컨베이어벨트는 박스가 올라가지 않는다. 컨베이어 벨트가 회전하면 말 그대로 회전이기 때문에 칸 자체의 내구도가 한칸 씩 밀린다.
ex)
- - - - - 위 (박스 가능, 첫번째 칸에는 박스 올림, 마지막 칸에는 박스 내림)
- - - - - 아래 (박스 없음, 컨베이어 벨트는 회전함)
문제에서는
1. 컨베이어 벨트가 회전하고(로봇은 그대로)
2. 로봇이 한칸 씩 옆으로 이동한다.(내구도 check, 이때 위 컨베이어 벨트의 끝에 도착했다면 로봇이 내려감)
원형큐처럼 생각하고 돌리면 된다. 아마 queue를 활용하면 편하겠지만 리스트로도 가능은 하다.
문제에 나와있는 순서대로 구현하면 된다.
N, K = map(int, input().split())
box = list(map(int, input().split()))
upBox = [0]*N
downBox = [0]*N
for i in range(N):
upBox[i] = [box[i], False]
for i in range(N):
downBox[i] = [box[N+i], False]
time= 0
while True:
time += 1
if upBox[N-1][1]: #끝에 로봇 내리기
upBox[N-1][1] = False
upLast = upBox[N-1][0]
for i in range(N-1, 0, -1): #위쪽 돌리기
upBox[i][1] = upBox[i-1][1]
upBox[i][0] = upBox[i-1][0]
if upBox[N-1][1]: #끝에 로봇 내리기
upBox[N-1][1] = False
downLast = downBox[N-1][0]
for i in range(N-1, 0, -1): #아래쪽 돌리기
downBox[i][0] = downBox[i-1][0]
upBox[0][0] = downLast
downBox[0][0] = upLast
upBox[0][1] = False
for i in range(N-1, 0, -1): #위쪽 돌리기
if not upBox[i][1] and upBox[i-1][1] and upBox[i][0] != 0:
upBox[i-1][1] = False
upBox[i][1] = True
upBox[i][0] -= 1
if upBox[0][0] != 0 and not upBox[0][1]: #박스 올리기
upBox[0][1] = True
upBox[0][0] -= 1
if upBox[N-1][1]: #끝에 로봇 내리기
upBox[N-1][1] = False
k = 0
for i in range(N):
if upBox[i][0] == 0:
k += 1
if downBox[i][0] == 0:
k+=1
if k >= K:
break
print(time)