본문 바로가기
알고리즘/[python] 백준 BOJ

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

by Alan_Kim 2023. 6. 22.
728x90
반응형

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

 

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

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

www.acmicpc.net

 

문제 해결

  • 문제에서 주어진 패턴을 몇 번 반복하는지 구하는 문제.
  • 회전을 하므로 stack이 아닌 que를 이용해야하므로 파이썬에선 deque를 이용한다.
  • container 안에 리스트를 만들어 로봇이 있으면 0을 추가적으로 넣어 이동시키는 것을 구현한다.
  • index가 n-1일 때 로봇이 있으면 언제든지 빼주도록 한다.(실수로 넘어가면 안된다...)
  • pypy3로 통과. 아무래도 pop을 많이 쓰기 때문에 python3에선 빡셀 수도 있다 생각했다.

 

CODE

from collections import deque
def simulate():
    global container
    # 벨트 회전
    container.appendleft(container[-1])
    container.pop()
    # 로봇 이동
    while len(container[n-1])>1:
        container[n-1].pop()
    for i in range(n-2,-1,-1):
        if len(container[i])>=2 and len(container[i+1])==1 and container[i+1][0] >=1:
            container[i+1].append(container[i].pop())
            container[i+1][0] -= 1
    while len(container[n-1])>1:
        container[n-1].pop()
    if container[0][0] >0:
        container[0].append(0)           
        container[0][0] -= 1         

if __name__=='__main__':
    n, k = map(int, input().split())
    A = list(map(int,input().split()))
    container = deque([[]for _ in range(2*n)])
    for i in range(2*n):
        container[i].append(A[i])
    t = 1
    while True:
        simulate()
        cnt = 0
        for i in range(2*n):
            if container[i][0] ==0:
                cnt += 1
        if cnt>=k:break
        else:t+=1
    print(t)
728x90
반응형

댓글