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로 설정하여 맨 뒤, 맨 앞의 리스트를 추가 및 삭제 하는 것을 편하게 했습니다.
'백준 문제풀이' 카테고리의 다른 글
1302번: 베스트셀러 / silver 4 / 문자열, 정렬 (1) | 2023.05.08 |
---|---|
14499번: 주사위 굴리기 / gold 4 / 구현, 시뮬레이션 (0) | 2023.05.06 |
17135번: 캐슬 디펜스 / gold 3 / 조합, copy, 시뮬레이션 (0) | 2023.05.04 |
2529번: 부등호 / silver 1 / 백트래킹, 브루트포스 (0) | 2023.05.03 |
16639번: 괄호 추가하기 3 / gold 1 / DP (0) | 2023.05.02 |