문제
https://www.acmicpc.net/problem/20055
소스코드
import sys
if __name__ == "__main__":
n,k = map(int,input().split())
convey = list(map(int,input().split()))
robot = [0] * n
res = 1
while 1:
#1 컨테이너 벨트 회전
last = convey.pop()
convey.insert(0,last)
#1 로봇 회전
robot.pop()
robot.insert(0, 0)
# 1-1 로봇이 내리는 위치에 도달하면 그 즉시 내린다
if robot[n-1]:
robot[n-1] = 0
#2 로봇 회전
for i in range(n-1,0,-1):
if convey[i] > 0 and not robot[i] and robot[i-1]: # 이동하려는 칸에 로봇이 없고, 칸의 내구도가 1이상이고, 이동할 로봇이 있어야함
robot[i] = 1
robot[i-1] = 0
convey[i] -=1
#3 올리는 칸에 로봇 올리기
if convey[0] > 0:
convey[0] -=1
robot[0] = 1
#4 컨베이어 벨트 내구도 0인 갯수 체크
if convey.count(0) >= k:
break
#5 단계 추가
res +=1
print(res)
설명
1. 컨베이어 벨트는 회전 후 마지막에 있는 칸이 0번째 칸이 된다
-> 전체 input 배열을 컨베이어 벨트라고 생각해주고, 동그란 모양을 일직선으로 펴서 이동한다고 생각하자
컨베이어 벨트를 일직선으로 늘리고 2n을 빼서 0으로 넣는다고 생각해보자
그럼 스택을 활용해서 pop 후 0번째에 insert 해주는 방식으로 구현할 수 있다.
2. 로봇은 1부터 n까지만 이동하고 무조건 n번째 컨베이어에 올라가면 제거된다. 그래서 robot 배열은 주어진 배열의 절반으로 초기화해준다. 로봇 배열 역시 스택이라고 생각하면 되지만 pop 해서 제거만 해주면 된다.
3. 시뮬레이션 구성은 다음과 같다.
- 컨베이어 벨트 배열과 로봇 배열을 회전시킨다.
- 로봇을 한칸씩 이동한다.
- 0번째 컨베이어에 로봇을 올릴 수 있으면 올린다.
- 컨베이어 벨트에 0의 갯수를 체크한다.
- 단계를 늘린다.
이때 주의할 점은 컨베이어 벨트와 로봇 배열을 회전시 로봇이 회전해서 n번째에 오게되면 제거해줘야한다. 안그러면 로봇 이동 단계에서 로봇이 있어서 이동이 안되는 문제가 발생한다. 로봇이 한칸씩 이동한 후엔 따로 제거해줄 필요없다. 다음 단계에서 어짜피 회전할 때 제거된다.
'Algorithm' 카테고리의 다른 글
[백준][python]21608 상어초등학교 (0) | 2023.08.16 |
---|---|
[백준][python]2559 수열 (0) | 2023.08.03 |
[백준][python]9935 문자열 폭팔 (0) | 2023.07.13 |
[백준][python] 구간 합 구하기5 (0) | 2023.07.11 |
[백준][python]1159 농구경기 (0) | 2023.07.05 |