[백준] 20055_컨베이어 벨트 위의 로봇

Arin·2025년 12월 5일

🔗문제 링크 바로가기

이 문제는 질문 이해가 관건인 것같다. 본문만 이해하면 구현하는건 크게 무리가 없는 것같다.
아래에 내가 헷갈렸던 부분을 정리해놨다.

  • 로봇이 올라갈 때마다 해당 칸의 내구도가 1씩 감소한다.
  • 로봇은 뒤쪽 컨베이어벨트 칸에 올라갈 수 없다. 따라서 로봇은 0~(N-1)번째 칸에만 존재할 수 있다. 따라서 로봇이 (N-1)번째 칸에 올라가면 내려줘야한다. 왜그러냐고 물으면 이유는 없다. 그냥 문제 조건일 뿐이다...

<각 단계>
- 1단계: 벨트가 회전하면 로봇도 그에 따라 회전한다.
- 2단계: 앞 칸이 비어있으면 로봇은 스스로 이동한다.
- 3단계: 0번째 칸에 로봇을 올린다(올릴 수 있으면)

  • 각 단계별로 회전을 무한대로 하는 것이 아니라 1단계에서 1칸씩 이동하면 2단계로 넘어가서 이동할 수 있는 로봇들은 1칸씩 이동한다. 그리고 3단계로 넘어가 하나의 로봇을 올리는 것이다.
from collections import deque
import sys
input = sys.stdin.readline

N, K = map(int, input().split())
A = deque(list(map(int, input().split()))) # 내구도
robots = deque([0] * N) # 로봇 위치(앞쪽 N칸만)

step = 0

while True:
    step += 1

    # 1. 벨트 + 로봇 회전
    A.rotate(1) # 벨트 회전
    robots.rotate(1) # 벨트가 회전함에 따라 로봇도 같이 회전
    robots[-1] = 0 # 내리는 위치에서 로봇 제거

    # 2. 로봇 이동(앞 칸이 비어있으면 스스로 이동)
    for i in range(N-2, -1, -1): # 뒤에서부터
        if robots[i] == 1 and robots[i+1] == 0 and A[i+1] > 0:
            robots[i] = 0
            robots[i+1] = 1
            A[i+1] -= 1

    robots[-1] = 0 # 내리는 위치에서 로봇 제거
        
    # 3. 올리는 칸에 로봇 올리기
    if A[0] > 0 and robots[0] == 0:
        robots[0] = 1
        A[0] -= 1

    # 4. 내구도 0인 칸의 개수 세기
    if A.count(0) >= K:
        break

print(step)
        
profile
헤맨만큼 내 땅

0개의 댓글