https://www.acmicpc.net/problem/20055
import sys
from collections import deque
sys.stdin = open("input.txt", 'r')
input = sys.stdin.readline
if __name__ == "__main__":
n,k = map(int,input().split())
belt = deque(list(map(int,input().split())))
robot = deque([0] * n)
res = 0
while 1:
belt.rotate(1)
robot.rotate(1)
robot[-1] = 0
if sum(robot):
for i in range(n-2,-1,-1):
if robot[i+1]==0 and robot[i]==1 and belt[i+1]>0:
belt[i+1]-=1
robot[i+1] = 1
robot[i]=0
robot[-1] = 0
if belt[0] > 0:
belt[0]-=1
robot[0]=1
res +=1
if belt.count(0) >=k:
break
print(res)
구현 문제로 컨베이어 벨트가 돌아간다는 것을 데크로 구현해주면 된다.
컨베이어 벨트는 2n개가 돌아가지만 로봇은 n개만 돌아간다 --> n에서 무조건 하차하니까
그래서 컨베이어 벨트랑 로봇이랑 배열을 2개로 나눠서 회전 (나는 처음에 같이 묶어서 2차원 배열로 하려니까 헷갈림;;;)
위의 원리를 이해한 후 문제에서 설명한 그대로 구현하면 된다.
- 배열 회전
- n 위치에 있는 로봇 하차
- n-2 부터 역순으로 체크해서 그 다음 칸에 로봇 없고 내구도 0보다 크면 로봇 이동
3-1. n-1엔 아무것도 없음 (아까 하차시킴)
3-2. 컨베이어 벨트는 내구도만 따지면 되니까 로봇배열만 생각해서 n 개만 탐색해주면 됨- 이동 종료 후엔 n 위치 로봇 한번 더 하차
- 로봇 0 칸에 내구성 0보다 크면 로봇 올리기 (내구도 내려줌)
- 단계 +=1
- 내구도가 0인 칸이 k개 이상이면 종료
나는 너무 어렵게 생각한다 쉽게 접근해보자ㅠ.ㅠ
새롭게 알게된 문법이 있었다
- deque.rotate(1) : 데크 자체에서 rotate 함수 지원;;;; 1만큼 오른쪽으로 회전한다. 만약 음수를 넣으면 -1 만큼 왼쪽으로 회전 가능
- belt.count(0) : 배열에서 0의 갯수 카운트