Hi

[백준/Python] 20055. 컨베이어 벨트 위의 로봇 본문

Algorithm/Baekjoon

[백준/Python] 20055. 컨베이어 벨트 위의 로봇

seungminleeee 2025. 9. 22. 16:43

https://www.acmicpc.net/problem/20055

 

📌  문제 접근

보자마자 구현문제라고 생각을 했다. 전체 길이 2N의 컨베이어에서 1번은 로봇이 올라가는 위치, N번은 로봇이 내려가는 위치이다.

동작과정은 아래와 같다.

  1. 벨트와 벨트 위 로봇이 함께 한 칸 회전한다.
  2. 가장 먼저 올라간 로봇부터 순서대로, 이동할 수 있다면 한 칸 이동한다.
    • 이동 조건: 이동하려는 칸에 로봇이 없고, 내구도가 1 이상 남아 있어야 한다.
  3. 올리는 위치의 내구도가 남아 있다면 새로운 로봇을 올린다.
  4. 내구도가 0인 칸이 K개 이상이면 과정을 종료한다. 아니면 다시 1번으로 돌아간다.

 

💡구현 아이디어

처음엔 두 가지 방법을 생각했다.

  1. 윗줄/아랫줄 컨베이어를 나눠서 따로 관리
  2. 인덱스를 직접 이동시키면서 관리

하지만 구현이 생각보다 복잡할 것 같았다.

 

따라서 deque를 이용해 직접 벨트를 이동시키기로 했다.

arr = deque(map(int, input().split()))
robot = deque([0] * N)

while True:
    last = arr.pop()
    arr.appendleft(last)

    last_robot = robot.pop()
    robot.appendleft(last_robot)

 

컨베이어와 로봇 리스트를 deque로 관리하고 마지막 원소를 빼서 가장 앞으로 추가하는 방식으로 구현했는데

이 과정에서 rotate 메서드를 알게 되었다.

 

🔍 deque의 rotate()

deque 안의 원소들을 밀어서 회전시켜주는 함수이다.

괄호 안에 양수를 넣으면 오른쪽 방향으로, 음수를 넣으면 왼쪽 방향으로 회전한다.

arr = deque(map(int, input().split()))
robot = deque([0] * N)

while True:
    arr.rotate(1)
    robot.rotate(1)

 

 

✅ 최종 풀이

전체 코드는 아래와 같다.

from collections import deque

N, K = map(int, input().split())
arr = deque(map(int, input().split()))   # 내구도
robot = deque([0] * N)                   # 로봇 위치
cnt = 0

while True:
    cnt += 1
    
    # 1. 벨트 & 로봇 회전
    arr.rotate(1)
    robot.rotate(1)
    robot[N-1] = 0  # 내리는 위치에서 로봇 제거
    
    # 2. 로봇 이동 (뒤에서부터 확인)
    for i in range(N - 2, -1, -1):
        if robot[i] == 1 and robot[i + 1] == 0 and arr[i + 1] > 0:
            robot[i] = 0
            robot[i + 1] = 1
            arr[i + 1] -= 1
    robot[N-1] = 0  # 내리는 위치에서 로봇 제거
    
    # 3. 로봇 올리기
    if arr[0] > 0 and robot[0] == 0:
        robot[0] = 1
        arr[0] -= 1
    
    # 4. 종료 조건 검사
    if arr.count(0) >= K:
        break

print(cnt)