코드트리 불안한 무빙워크
무빙워크의 레일은 시계 방향으로 회전한다.
무빙워크의 움직임)
1번 칸부터 2n-1번 칸은 한 번 회전할 때 2n번째 칸의 위치로 이동하게 되고 2n번째 칸은 1번째 칸의 위치로 이동하게 된다.
사람의 움직임)
각 사람은 1번 칸에 올라서서 n번 칸에서 내리게 됩니다. 사람이 어떤 칸에 올라가거나 이동하면 그 칸의 안정성은 즉시 1만큼 감소하게 되며 안정성이 0인 칸에는 올라갈 수 없다.
안정성 테스트)
단, 1~3 과정 중 n번 칸 위치에 사람이 위치하면 그 즉시 내리게 된다.
각 칸의 안정성은 시간에 지남에 따라 다시 상승하지 않는다.
과정이 종료될 때 몇 번째 실험을 하고 있었는지 구하는 프로그램
(입력 및 선언)
(실험 과정)
무빙워크의 맨 뒷 칸을 앞으로 보낸다
사람의 위치도 맨 뒤에서 앞으로 보낸다
(사람 내리기)
만약 n번 칸에 사람이 있으면 내린다
(사람 움직이기)
n회동안 반복한다
이전 칸에 사람이 있고, 칸의 안정성이 0보다 크고, 이 칸에 사람이 없으면 이동한다.
안정성을 1 감소시킨다. → 안정성이 0이면 chk를 1 증가시킨다.
(사람 내리기)
만약 n번 칸에 사람이 있으면 내린다
(첫 칸 사람 올리기)
첫 칸의 안정성이 0보다 크다면 사람을 올리고 안정성을 1 감소시킨다.
만약 안정성이 0이면 chk를 1 증가시킨다.
(최종 출력하기)
from collections import deque
n, k = map(int, input().split())
safe = deque(list(map(int, input().split())))
person = deque([0 for _ in range(n*2)])
chk = 0
ans = 0
def simulate():
global chk
# 무빙워크 뒷 칸을 앞으로
safe.appendleft(safe.pop())
person.appendleft(person.pop())
# n번 칸 사람 내리기
if person[n-1]:
person[n-1] = 0
# 사람 이동시키기
# 현재 위치에 사람이 없고 안정성은 남아 있으면서 이전 위치에 사람이 있는 경우
for i in range(n):
if person[n] == 0 and safe[i] and person[i-1]:
person[i] = 1
person[i-1] = 0
safe[i] -= 1
# 안정성이 0이면 체크
if safe[i] == 0:
chk += 1
# n번 칸 사람 내리기
if person[n-1]:
person[n-1] = 0
# 사람 올리기
if safe[0]:
person[0] = 1
safe[0] -= 1
# 안정성이 0이면 체크
if safe[i] == 0:
chk += 1
while True:
simulate()
ans += 1
# 안정성 0이 k개 이상이면 종료
if chk >= k:
break
print(ans)