Hi
[백준/Python] 20055. 컨베이어 벨트 위의 로봇 본문
https://www.acmicpc.net/problem/20055
📌 문제 접근
보자마자 구현문제라고 생각을 했다. 전체 길이 2N의 컨베이어에서 1번은 로봇이 올라가는 위치, N번은 로봇이 내려가는 위치이다.

동작과정은 아래와 같다.
- 벨트와 벨트 위 로봇이 함께 한 칸 회전한다.
- 가장 먼저 올라간 로봇부터 순서대로, 이동할 수 있다면 한 칸 이동한다.
- 이동 조건: 이동하려는 칸에 로봇이 없고, 내구도가 1 이상 남아 있어야 한다.
- 올리는 위치의 내구도가 남아 있다면 새로운 로봇을 올린다.
- 내구도가 0인 칸이 K개 이상이면 과정을 종료한다. 아니면 다시 1번으로 돌아간다.
💡구현 아이디어
처음엔 두 가지 방법을 생각했다.
- 윗줄/아랫줄 컨베이어를 나눠서 따로 관리
- 인덱스를 직접 이동시키면서 관리
하지만 구현이 생각보다 복잡할 것 같았다.
따라서 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)
'Algorithm > Baekjoon' 카테고리의 다른 글
| [백준/Python] 2573. 빙산 (0) | 2025.09.17 |
|---|---|
| [백준/Python] 2096. 내려가기 (0) | 2025.09.04 |
| [백준/Python] 1916. 최소비용 구하기 (0) | 2025.09.03 |
| [백준/Python] 5972. 택배 배송 (0) | 2025.08.25 |
| [백준/Python] 11725. 트리의 부모 찾기 (0) | 2025.03.27 |