상세 컨텐츠

본문 제목

[백준20055번] 컨베이어 밸트위의 로봇(파이썬)

알고리즘 공부

by Tabris4547 2022. 4. 24. 15:52

본문

728x90

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

 

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

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

www.acmicpc.net

이 문제같은 경우에는

간단하게 deque의 rotate함수를 활용하는 방식이 있습니다만

공부의 관점에서 빡구현을 해봤습니다.

 

이 문제가 요구하는 사항은 다음과 같습니다.

 

1. 컨베이어벨트와 로봇을 돌린다.

 

2. 로봇을 이동

 

3. 새로운 로봇 투입

 

이 세가지를 반복해주는 작업을 겨쳐줍니다.

 

먼저, 컨베이어 밸트를 옮겨주는 작업,

여기서 end는

2*N입니다.

#1.밸트위의 로봇과 함께 회전
tmp=graph[end-1]
graph[1:end]=graph[0:end-1]
graph[0]=tmp

처음에는

graph[1:end-1]=graph[0:end-2]

이렇게 코드를 구성했으나

문제가 원하는 데로

컨베이어 밸트가 이동하지 않았습니다.

그 이유는 

list[1:X]이렇게 넣으면

range(X)가 X-1까지 범위를 해주듯

얘도 그렇게 작동했습니다.

그래서 위의 예시처럼 해줘야

제대로 동작합니다.

그리고 로봇이 움직일 때

내리는 위치(N-1)에 이동하면

로봇을 내려줘야 합니다.

처음에 제가 이걸 놓쳐서

고생을 조금 했습니다.

 

2.로봇이동의 경우

로봇을 넣은 순서대로 움직이라고 되어있습니다.

저는 robot이라는 리스트를 만들어

3에서 로봇을 투입하는 데로

append를 시켜줬고

for문을 활용해서

순서대로 구해주었습니다.

 

3. 로봇 투입의 경우

투입위치 graph[0]가

0보다 큰 지 보고 로봇을 투입시켜줍니다.

 

#백준 20055 컨베이어 밸트위의 로봇

N,K=map(int,input().split())

graph=list(map(int,input().split()))

#올리는 위치-0 내리는 위치-N-1
robot=[]
end=(2*N)


level=0
while True:
    #1.밸트위의 로봇과 함께 회전
    tmp=graph[end-1]
    graph[1:end]=graph[0:end-1]
    graph[0]=tmp
    #print(robot)
    if robot:
        pop_robot=[]
        for i in range(len(robot)):
            robot[i]=(robot[i]+1)%(2*N)
            if robot[i]==N-1:
                pop_robot.append(i)
        if pop_robot:
            while pop_robot:
                po=pop_robot.pop()
                robot.pop(po)

    #2.가장 먼저 올라간 로봇부터 이동
    if robot:
        pop_robot=[]
        for i in range(len(robot)):
            move_robot=(robot[i]+1)%(end)
            if graph[move_robot]>0 and not move_robot in robot:
                robot[i]=move_robot
                graph[move_robot]-=1
                #움직인 위치가 내리는 위치라면
                if move_robot==N-1:
                    pop_robot.append(i)
        if pop_robot:
            while pop_robot:
                po=pop_robot.pop()
                robot.pop(po)
    #3.올리는 위치 내구도가 0이 아니라면 로봇을 올림.
    if graph[0]>0:
        robot.append(0)
        graph[0]-=1
    level+=1
    #내구도가 0인게 K이상이면 종료
    if graph.count(0)>=K:
        break


print(level)

pypy3로 통과했으나

python3로는 시간초과가 발생했습니다.

https://jinu0418.tistory.com/16

 

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

문제 출처 : www.acmicpc.net/problem/20055 20055번: 컨베이어 벨트 위의 로봇 길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으

jinu0418.tistory.com

https://jainn.tistory.com/81

 

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

문제 www.acmicpc.net/problem/20055 20055번: 컨베이어 벨트 위의 로봇 길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개

jainn.tistory.com

물론 이렇게 rotate함수를 쓰면

간단하게도 풀 수 있습니다.

rotate가 만약에 생각이 안났다?

그리고 내가 새로운 문제에 대한 적응이 필요하다?

라고 한다면

rotate대신 썡구현도 해볼만 할 것 같네요

728x90

관련글 더보기

댓글 영역