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

jisu_log·2025년 5월 26일

알고리즘 문제풀이

목록 보기
31/105

각 칸의 내구도를 저장하는 A_list와 로봇의 유무를 저장하는 robot_list 구현 시 리스트 대신 deque로 구현하면 .rotate(1)을 사용하여 오른쪽으로 1칸 회전을 쉽게 할 수 있음

  • .rotate(-1)은 왼쪽으로 1칸 회전
from collections import deque

n, k = map(int, input().split())
A_list = deque(map(int, input().split()))
robot_list = deque([0] * (n))

0 ~ 2n - 1

올리는 위치: 0

내리는 위치: n - 1

count_loop = 0

while True:

# 1) 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.

A_list.rotate(1) # deque의 .rotate()를 사용하여 오른쪽으로 1칸 회전
robot_list.rotate(1)

'''
temp = A_list[0]

for i in range(2 * n - 1, -1, -1):
    # 내구도 이동
    if i == (2 * n - 1):
        A_list[0] = A_list[i]
    elif i == 0:
        A_list[1] = temp
    else:
        A_list[i + 1] = A_list[i]

    # 로봇 이동
    if 0 <= i <= n - 2:
        if robot_list[i] == 1:
            robot_list[i] = 0
            robot_list[i + 1] = 1
'''
# 회전 후 내리는 칸은 로봇 비우기
robot_list[-1] = 0


# 2) 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
# 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
for i in range(n - 2, -1, -1):
    
    if robot_list[i] == 1 and robot_list[i + 1] == 0 and A_list[i + 1] >= 1:
        robot_list[i] = 0
        robot_list[i + 1] = 1
        if A_list[i + 1] > 0:
            A_list[i + 1] -= 1 # 로봇 이동 시 즉시 내구도 1 감소

# 내리는 칸은 로봇 비우기
robot_list[-1] = 0

# 3) 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
if A_list[0] > 0:
    robot_list[0] = 1
    A_list[0] -= 1 # 로봇 올리고 즉시 내구도 1 감소

count_loop += 1

# 4)내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
if A_list.count(0) >= k:
    break

print(count_loop)

0개의 댓글