알고리즘 문제 풀이

138. [삼성기출34]Python 백준 20055 번 컨베이어 벨트 위의 로봇 자세한 설명

코딩하는 덕구 🐶 2023. 8. 9. 13:49
728x90

안녕하세요 코딩하는 덕구입니다.

파이썬 백준 20055 컨베이어 벨트 위의 로봇 입니다.

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

 

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

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

www.acmicpc.net

 

문제 접근

1. 컨베이어 벨트를 돌립니다. -> 큐를 이용하여 가장 마지막의 성분을 pop후 맨 앞에 append해주면 됩니다. 

2. 로봇이 이동가능하면 한 칸씩 이동합니다. 

3. 로봇을 올리는 위치에 올릴 수 있다면 올립니다.

4. 내구도를 체크하여 내구도가 0 인 벨트가 K 개 이상인지 확인합니다.

5. 4의 조건을 만족할 때 까지 1~5를 반복합니다.

 

Python 정답 코드

백준 20055 컨베이어 벨트 위의 로봇 파이썬 코드입니다. 설명은 아래에 있습니다.

 

from collections import deque
N, K = map(int, input().split())
belt = deque(map(lambda x:[x, 0], map(int, input().split())))
zero_dura = 0

def rotate():
    tmp = belt.pop()
    belt.appendleft(tmp)
    belt[N-1][1] = 0 #내리는 곳의 로봇 제거

def move_robot():
    global zero_dura
    for i in range(N-2, -1, -1):
        if belt[i][1] == 1:
            if belt[i + 1][0] >= 1 and belt[i + 1][1] == 0:
                belt[i + 1][1] = 1
                belt[i + 1][0] -= 1
                if belt[i + 1][0] == 0:
                    zero_dura += 1

                belt[N - 1][1] = 0 #벨트 내리는 곳 로봇 내리기
                belt[i][1] = 0

def load_robot():
    global zero_dura
    if belt[0][0] != 0:
        belt[0][1] = 1
        belt[0][0] -= 1
        if belt[0][0] == 0:
            zero_dura += 1

def check_durability():
    if zero_dura >= K:
        return True
    return False

def solve():
    cnt = 0
    while True:
        cnt += 1
        rotate()
        move_robot()
        load_robot()

        if check_durability():
            return cnt

print(solve())

 

Python 코드 설명

문제의 정답을 return하는 함수 solve() 입니다.

4번 조건에 맞을 때 까지 회전(rotate), 로봇 움직이기(move_robot), 로봇 올리기(load_robot)을 반복하며

cnt를 증가시키고, 4번 조건에 맞다면 cnt를 return 합니다.

def solve():
    cnt = 0
    while True:
        cnt += 1
        rotate()
        move_robot()
        load_robot()

        if check_durability():
            return cnt
print(solve())

 

로봇의 회전입니다. 큐를 이용하여 맨 뒤의 성분을 맨 앞으로 옮겨주면 됩니다.

이때 내리는 곳의 로봇을 제거합니다.

def rotate():
    tmp = belt.pop()
    belt.appendleft(tmp)
    belt[N-1][1] = 0 #내리는 곳의 로봇 제거

 

로봇의 이동입니다.

내리는곳 한칸 앞에서부터  벨트를 확인하여 만약 벨트위에 로봇이 있다면

벨트 다음칸의 내구도가 충분한지 확인하고, 로봇이 없는지 확인합니다.

만약 그렇다면 로봇을 다음칸으로 옮기고 

다음칸의 내구도를 1 감소시킵니다. 이때 옮기고 나서 내구도가 0이 되면

내구도가 0 인 벨트의 개수인 zero_dura를 증가시킵니다.

이후 벨트 내리는 곳의 로봇을 내립니다.

만약 로봇이 없어도 어차피 로봇이 있는지 확인하는데 시간이 걸리므로 그냥 내리면 됩니다.

def move_robot():
    global zero_dura
    for i in range(N-2, -1, -1):
        if belt[i][1] == 1:
            if belt[i + 1][0] >= 1 and belt[i + 1][1] == 0:
                belt[i][1] = 0
                belt[i + 1][1] = 1
                belt[i + 1][0] -= 1
                if belt[i + 1][0] == 0:
                    zero_dura += 1
                belt[N - 1][1] = 0 #벨트 내리는 곳 로봇 내리기

 

벨트 위에 로봇을 올리는 함수 load_robot()입니다.

벨트의 내구도가 충분하면 로봇을 올리고 내구도가 0인지 확인한 후

만약 그렇다면 zero_dura를 증가시킵니다.

def load_robot():
    global zero_dura
    if belt[0][0] != 0:
        belt[0][1] = 1
        belt[0][0] -= 1
        if belt[0][0] == 0:
            zero_dura += 1

 

내구도가 0인 벨트가 K개 이상인지 확인하는 함수 입니다.

def check_durability():
    if zero_dura >= K:
        return True
    return False

 

백준 20055 컨베이어 벨트 위의 로봇 Python 코드였습니다.

감사합니다.

728x90