chldkato

백준 20055 컨베이어 벨트 위의 로봇 (파이썬) 본문

백준

백준 20055 컨베이어 벨트 위의 로봇 (파이썬)

chldkato 2020. 10. 28. 19:37

www.acmicpc.net/problem/20055

 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net

1. 내구도를 a에 저장하고 로봇이 있는 지 확인하는 c와 로봇이 있는 위치를 저장하는 robot을 만든다 

2. 문제의 조건대로 내구도가 0인 벨트가 k 이상일 때까지 반복한다

   단계를 저장하는 cnt에 1을 더하고 a와 c를 한칸씩 회전한다

   이 때 내려가는 칸에 해당하는 len(c) // 2 - 1번째에 로봇이 있으면 0으로 초기화해 없애준다

3. 현재 robot의 길이만큼 반복해서 맨 왼쪽에 있는 로봇의 위치 rx를 하나씩 pop 한다

   rx는 벨트가 회전하기 전의 좌표이기 때문에 rx에 1을 더해준다

   더한 뒤의 rx가 내려가는 칸이면 앞에서 없앤 로봇이기 때문에 continue한다

4. 다시 rx에 1을 더해서 다음칸에 해당하는 nx를 만든다

   다음 칸에 로봇이 없고 다음 칸의 내구도가 0보다 크면 이동한다

   이동할 수 없으면 robot에 현재 좌표인 rx를 append 해준다

5. 다음칸이 내려가는 칸이면 로봇을 없애준다

   내려가는 칸이 아니면 robot에 다음 좌표인 nx를 append 하고 c[rx]와 c[nx]를 각각 0과 1로 갱신한다

   이동했으므로 내구도를 1 빼준다

6. 올라가는 칸의 내구도가 0보다 크고 로봇이 없으면 robot에 0을 append하고 좌표와 내구도를 갱신한다

7. 반복문을 나오면 cnt를 출력한다

from collections import deque
import sys

input = sys.stdin.readline

n, k = map(int, input().split())
a = list(map(int, input().split()))
c = [0] * (2*n)
robot = deque()
cnt = 0

while True:
    cnt += 1
    a = a[-1:] + a[:-1]
    c = c[-1:] + c[:-1]
    if c[len(c) // 2 - 1]:
        c[len(c) // 2 - 1] = 0

    qlen = len(robot)
    for _ in range(qlen):
        rx = robot.popleft()
        rx += 1
        if rx == len(a) // 2 - 1:
            continue
        nx = rx + 1
        if not c[nx] and a[nx] > 0:
            if nx == len(a) // 2 - 1:
                c[rx] = 0
            else:
                robot.append(nx)
                c[rx], c[nx] = 0, 1
            a[nx] -= 1
        else:
            robot.append(rx)

    if a[0] > 0 and not c[0]:
        robot.append(0)
        c[0] = 1
        a[0] -= 1

    if a.count(0) >= k:
        break

print(cnt)

Comments