[백준 삼성기출 O] 컨베이어 벨트 위의 로봇(python)

이진규·2022년 10월 9일
1

백준(PYTHON)

목록 보기
107/115

문제

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() 정도 배워갈 수 있음.

참고 자료

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글