Algorithm (PS)

[백준] 20055번 : 컨베이어 벨트 위의 로봇 (Python)

minjiwoo 2023. 2. 9. 01:33
728x90

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

 

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

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

www.acmicpc.net

이 문제는 문제를 읽고 이해하는데 시간이 걸렸다.. 

결론적으로 구현해야 할 것은 다음의 1 ~ 4 번이고 이걸 묶어서 한단계라고 하는 것이다. '몇 번째 단계'인지 구하는건데 이것도 설명에 명확히 나와있지 않아서 오래 걸렸다 ㅡㅡ 그래도 deque로 원형큐를 시뮬레이션하는 방법과 같이 인상깊은 점이 있어서 재미있는 문제였다

 

배운 점

1. 원형큐에서 회전할 때 deque.rotate() 함수를 기억하면 매우 유용하다. rotate()는 안에 양수인 숫자를 써주면 그 값만큼 오른쪽으로 회전시킨다

# 1. 벨트와 로봇 함께 회전
array.rotate(1) # 오른쪽으로 1만큼 이동
robot.rotate(1)

2. 시뮬레이션 문제는 문제를 꼼꼼히 읽고 세세하게 처리해야할 부분을 먼저 메모하고 구현하자...! 

3. 한 칸씩 갱신하면서 이동하는 구현의 경우 뒤에서 부터 앞으로 확인해야 값이 올바르게 확인된다. 앞에서부터 뒤로 확인한다면 계속 갱신된 값으로 확인하게 되는 오류를 범할 수 있다. 

for i in range(n-2, -1, -1):
    # 현재 칸에 로봇이 있고 다음칸이 빈칸 & 내구성 1 이상
    if robot[i] == 1 and robot[i+1] == 0 and array[i+1] >= 1:
        robot[i+1] = 1
        array[i+1] -= 1
        robot[i] = 0

 

전체 코드 

from collections import deque

n, k = map(int, input().split())
array = deque(list(map(int, input().split())))
robot = deque([0 for _ in range(n)]) # 0 번칸 : 로봇 올리기, N-1 번칸 : 로봇 내리기
answer = 1 # 단계

def check():
    if array.count(0) >= k:
        return True
    return False

def rotate_belt():
    global answer
    # robot[0] = 1
    # array[0] -= 1
    idx = 0
    while True:
        # 1. 벨트와 로봇 함께 회전
        array.rotate(1) # 오른쪽으로 1만큼 이동
        robot.rotate(1)
        # 로봇 삭제하기 --- n-1 칸에 도착하면 로봇 삭제함!!!!
        if robot[n-1] == 1:
            robot[n-1] = 0

        # 2. 로봇 이동시키기 -> 거꾸로 확인해야 갱신이 맞게 이루어짐
        for i in range(n-2, -1, -1):
            # 현재 칸에 로봇이 있고 다음칸이 빈칸 & 내구성 1 이상
            if robot[i] == 1 and robot[i+1] == 0 and array[i+1] >= 1:
                robot[i+1] = 1
                array[i+1] -= 1
                robot[i] = 0
        # 로봇 내리기 (삭제)
        if robot[n-1] == 1:
            robot[n-1] = 0

        if robot[0] == 0 and array[0] >= 1:
            robot[0] = 1
            array[0] -= 1

        #4.  내구도 확인
        if check():
            return answer
        answer += 1  # 다음 단계

print(rotate_belt())
728x90