728x90
https://www.acmicpc.net/problem/20055
이 문제는 문제를 읽고 이해하는데 시간이 걸렸다..
결론적으로 구현해야 할 것은 다음의 1 ~ 4 번이고 이걸 묶어서 한단계라고 하는 것이다. '몇 번째 단계'인지 구하는건데 이것도 설명에 명확히 나와있지 않아서 오래 걸렸다 ㅡㅡ 그래도 deque로 원형큐를 시뮬레이션하는 방법과 같이 인상깊은 점이 있어서 재미있는 문제였다
배운 점
1. 원형큐에서 회전할 때 deque.rotate() 함수를 기억하면 매우 유용하다. rotate()는 안에 양수인 숫자를 써주면 그 값만큼 오른쪽으로 회전시킨다
# 1. 벨트와 로봇 함께 회전
array.rotate(1) # 오른쪽으로 1만큼 이동
robot.rotate(1)
2. 시뮬레이션 문제는 문제를 꼼꼼히 읽고 세세하게 처리해야할 부분을 먼저 메모하고 구현하자...!
3. 한 칸씩 갱신하면서 이동하는 구현의 경우 뒤에서 부터 앞으로 확인해야 값이 올바르게 확인된다. 앞에서부터 뒤로 확인한다면 계속 갱신된 값으로 확인하게 되는 오류를 범할 수 있다.
for i in range(n-2, -1, -1):
# 현재 칸에 로봇이 있고 다음칸이 빈칸 & 내구성 1 이상
if robot[i] == 1 and robot[i+1] == 0 and array[i+1] >= 1:
robot[i+1] = 1
array[i+1] -= 1
robot[i] = 0
전체 코드
from collections import deque
n, k = map(int, input().split())
array = deque(list(map(int, input().split())))
robot = deque([0 for _ in range(n)]) # 0 번칸 : 로봇 올리기, N-1 번칸 : 로봇 내리기
answer = 1 # 단계
def check():
if array.count(0) >= k:
return True
return False
def rotate_belt():
global answer
# robot[0] = 1
# array[0] -= 1
idx = 0
while True:
# 1. 벨트와 로봇 함께 회전
array.rotate(1) # 오른쪽으로 1만큼 이동
robot.rotate(1)
# 로봇 삭제하기 --- n-1 칸에 도착하면 로봇 삭제함!!!!
if robot[n-1] == 1:
robot[n-1] = 0
# 2. 로봇 이동시키기 -> 거꾸로 확인해야 갱신이 맞게 이루어짐
for i in range(n-2, -1, -1):
# 현재 칸에 로봇이 있고 다음칸이 빈칸 & 내구성 1 이상
if robot[i] == 1 and robot[i+1] == 0 and array[i+1] >= 1:
robot[i+1] = 1
array[i+1] -= 1
robot[i] = 0
# 로봇 내리기 (삭제)
if robot[n-1] == 1:
robot[n-1] = 0
if robot[0] == 0 and array[0] >= 1:
robot[0] = 1
array[0] -= 1
#4. 내구도 확인
if check():
return answer
answer += 1 # 다음 단계
print(rotate_belt())
728x90
'Algorithm (PS)' 카테고리의 다른 글
[백준] 10830번: 행렬 제곱 - Python (0) | 2023.02.11 |
---|---|
[백준] 9372번 상근이의 여행 Python (0) | 2023.02.09 |
[백준] 22862번: 가장 긴 짝수 연속한 부분 수열 (large) - Python (0) | 2023.02.06 |
[백준] 11559번: Puyo Puyo - Python풀이 (BFS, 구현) (0) | 2023.02.05 |
[백준] 21923 곡예 비행 Python - DP (0) | 2023.01.31 |