- 문제 : https://www.acmicpc.net/problem/20055

 

문제 이해 

- 어떻게 풀어야 하는지 문제 자체가 이해가지 않았던 문제

- 로봇을 컨베이어 벨트에 올리는데 컨베이어 벨트의 0인덱스에만 로봇 박스를 올릴 수 있다

- 로봇을 올린 후 로봇은 한 칸씩 앞으로 갈 수 있는데, 이 때 앞 칸의 내구성이 1 이상이고, 로봇이 없어야 한다

- 각 컨베이어 벨트 칸에는 내구성이 주어지는데, 이는 로봇이 하나씩 지날때마다 1씩 감소한다. 

- 그리고 n번째 컨베이어벨트에서는 무조건 로봇을 내려야 한다

- 로봇을 올리고, 이동할 수 있을 때 이동하는 과정을 한단계라고 한다면, 이 단계를 총 몇 번해야하는지 출력하는 문제다. 

- 작동이 멈추는 조건은 컨베이어 벨트 칸의 내구성이 0인 벨트의 개수가 k개 이상일 경우이다. 

 

추가로 파이썬의 rotate()함수도 알게 되었는데, 이는 deque 라이브러리에 있는 함수로, rotate(1)을 하면 오른쪽으로 이동하고, 가장 뒤에 있는 것이 가장 앞으로 온다. 

 

- 예시

a = deque([1, 2, 3, 4, 5])
print(a)

a.rotate(1) # 오른쪽으로 이동
print(a)

# 출력
deque([1, 2, 3, 4, 5])
deque([5, 1, 2, 3, 4])

 

정답 풀이 

from collections import deque

n, k = map(int, input().split())
belt = deque(list(map(int, input().split())))
robot = deque([0] * n)
answer = 0

while True:
    belt.rotate(1)
    robot.rotate(1)
    robot[-1] = 0
    
    if sum(robot): #로봇이 존재할 때
        for i in range(n - 2, -1, -1):
            if robot[i] == 1 and robot[i + 1] == 0: # 다음 칸에 로봇 없고
                if belt[i + 1] >= 1 : #벨트 내구성 1이상
                    robot[i + 1] = 1
                    robot[i] = 0
                    belt[i + 1] -= 1
        robot[-1] = 0 # 맨 마지막에 있는 박스 내림 
        
    if robot[0] == 0 and belt[0] >= 1 : # 올리는 위치에 로봇 없고, 내구성 1이상
        robot[0] = 1
        belt[0] -= 1
    
    answer += 1
    if belt.count(0) >= k:
        break

print(answer)

 

 

 

참고 블로그

https://unie2.tistory.com/924

https://yeomss.tistory.com/290

+ Recent posts