본문 바로가기

백준 문제풀이

20055번: 컨베이어 벨트 위의 로봇 / gold 5 / 시뮬레이션

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

 

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

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

www.acmicpc.net

'''
20055번: 컨베이어 벨트 위의 로봇 / gold 5 / 시뮬레이션
'''
import sys
from collections import deque

input = sys.stdin.readline

N, K = map(int, input().split())
convey = list(map(int, input().split()))
convey = deque(convey)
robot = [0 for _ in range(N)]
robot = deque(robot)

res = 0
done = 0
# 로봇 옮기는 과정 시뮬레이션 실행
while True:
    res += 1
    # 1. 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
    convey.appendleft(convey.pop())
    robot.appendleft(0)
    robot.pop()
    if robot[-1] == 1:
        robot[-1] = 0
    # 2. 로봇 한 칸 이동
    for i in range(N - 1, -1, -1):
        if robot[i] == 1:
            # 옆에 컨베이어 내구성 있고, 로봇이 없을 시,
            if robot[i + 1] == 0 and convey[i + 1] > 0:
                robot[i], robot[i + 1] = 0, 1
                convey[i + 1] -= 1
                if convey[i + 1] == 0:
                    done += 1
    # 3. 올리는 위치에 로봇 올리기
    if convey[0] != 0:
        robot[0] = 1
        convey[0] -= 1
        if convey[0] == 0:
            done += 1
    # 4. 내구도 0인 컨베이어 칸 K개 이상인지 확인
    if done >= K:
        break
# 출력하기
print(res)

코드 리뷰

- 해당 문제를 푸는데 약 45분이 소요되었습니다.

- 컨베이어 벨트를 이용해 로봇들을 건너편으로 옮기는 과정을 구현하는 문제입니다.

- 따라서 과정들을 꼼꼼하게 읽고 구현하면 쉽게 문제를 풀 수 있습니다.

 

중요 부분

- 어떻게 컨베이어와 로봇 회전을 구현할 것인가?

   /  convey와 robot 리스트 모두 deque로 설정하여 맨 뒤, 맨 앞의 리스트를 추가 및 삭제 하는 것을 편하게 했습니다.