138. [삼성기출34]Python 백준 20055 번 컨베이어 벨트 위의 로봇 자세한 설명
안녕하세요 코딩하는 덕구입니다.
파이썬 백준 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 코드였습니다.
감사합니다.