[ BOJ / Python ] 20055번 컨베이어 벨트 위의 로봇
이번 문제는 deque를 이용하여 해결하였다. 우선 조건대로 deque의 rotate()함수를 이용하여 벨트와 로봇을 한칸씩 이동시키고, n-1인덱스에 위치하는 로봇을 없애준다. 그리고 로봇 리스트를 뒤에서부터 순회하며 다음 칸에 로봇이 없고 다음 칸의 내구도가 0보다 클 때에만 로봇을 한칸 이동시켜준다. 이때에도 로봇이 n-1인덱스에 위치하게 될 수 있으므로 n-1위의 로봇을 없애준다. 그리고 올리는 위치에 로봇이 없고, 올리는 위치의 내구도도 0보다 크다면 로봇을 하나 올려준다.
- n, k를 입력받는다.
- 컨베이어 벨트의 내구도를 저장할 리스트 belt를 deque로 선언한다.
- 로봇의 위치를 저장할 리스트 robot을 deque로 선언한다.
- 정답을 저장할 변수 answer를 0으로 선언한다.
- while문을 돌린다.
-> belt를 1 방향으로 rotate한다.
-> robot을 1 방향으로 rotate한다.
->robot[-1]
을 0으로 갱신한다.
-> n-2부터 0까지 감소하는 i에 대한 for문을 돌린다.
--> 만약robot[i]
가 1일 경우,
---> 만약robot[i+1]
이 0이고,belt[i+1]
이 0보다 클 경우,
---->robot[i]
와robot[i+1]
을 0과 1로 갱신한다. (로봇의 이동)
---->belt[i]
를 1 감소시킨다. (로봇의 이동으로 인한 내구도 감소)
->robot[-1]
을 0으로 갱신한다.
-> 만약belt[0]
이 0보다 크고,robot[0]
이 0일 경우,
-->robot[0]
을 1로 갱신한다.
-->belt[0]
을 1 감소시킨다.
-> answer를 1 증가시킨다.
-> 만약 belt에 0의 갯수가 k 이상일 경우,
--> while문을 종료한다. - answer를 출력한다.
Code
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
for i in range(n-2, -1, -1):
if robot[i]==1:
if robot[i+1]==0 and belt[i+1]>0:
robot[i], robot[i+1]=0, 1
belt[i+1]-=1
robot[-1]=0
if belt[0]>0 and robot[0]==0:
robot[0]=1
belt[0]-=1
answer+=1
if belt.count(0)>=k:
break
print(answer)
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
for i in range(n-2, -1, -1):
if robot[i]==1:
if robot[i+1]==0 and belt[i+1]>0:
robot[i], robot[i+1]=0, 1
belt[i+1]-=1
robot[-1]=0
if belt[0]>0 and robot[0]==0:
robot[0]=1
belt[0]-=1
answer+=1
if belt.count(0)>=k:
break
print(answer)
Author And Source
이 문제에 관하여([ BOJ / Python ] 20055번 컨베이어 벨트 위의 로봇), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@xx0hn/BOJ-Python-20055번-컨베이어-벨트-위의-로봇저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)