https://www.acmicpc.net/problem/20055
공부 날짜 : 2022.09.30
정답 참조 여부 : X
컨베이어 벨트가 내구도를 가지고 움직이고 그 위에 로봇이 움직인다.
올리는 위치에 내구도가 0이상이면 로봇을 올리며 내구도가 깎이며 내리는 위치에 로봇이 오면 로봇을 내린다 이때 내구도 0인 칸이 k개 이상이되는 단계를 구하는 문제이다.
쉽다. 많이 쉬웠다.
파이썬에서 기본 제공되는 기능이 많았던건지 모르겠지만 파이썬으로 구현하는건 30분도 채 걸리지 않았다.
각 순서를 함수로 만들고 내구도가 깎일때 0이 되는지 체크해서 개수를 세준 뒤
각 순서를 반복하며 0인 칸의 개수가 k개 이상인지 확인만 하면 쉽게 풀렸다.
import sys
input = sys.stdin.readline
#########################################################
#데이터 입력받기
n,k = map(int, input().split())
temp = list(map(int, input().split()))
#내구도가 0인 칸의 개수
count_zero = 0
#로봇의 유무와 내구도 저장
belt = []
for i in range(2*n):
if temp[i] == 0:
count_zero += 1
belt.append([0,temp[i]])
#########################################################
#컨베이어 벨트 회전
def turn():
#이전 과정에서 내리는 칸에 왔으면 내리기
belt[n-1][0] = 0
#회전
belt.insert(0, belt.pop(-1))
#회전 후 내리는 칸에 있으면 내리기
belt[n-1][0] = 0
#########################################################
#로봇의 이동
def move_robot():
for robot in range(n-2,-1,-1):
if belt[robot][0] == 1 and belt[robot+1][0] == 0 and belt[robot+1][1] > 0:
belt[robot][0] = 0
belt[robot+1][0] = 1
belt[robot+1][1] -= 1
if belt[robot+1][1] == 0:
global count_zero
count_zero += 1
#########################################################
#로봇 올리기
def put_on_robot():
if belt[0][1] > 0:
belt[0][0] = 1
belt[0][1] -= 1
if belt[0][1] == 0:
global count_zero
count_zero += 1
#########################################################
#연산 수행
count = 0
while True:
if count_zero >= k:
print(count)
break
count += 1
turn()
move_robot()
put_on_robot()
#########################################################