문제
https://www.acmicpc.net/problem/11060
11060번: 점프 점프
재환이가 1×N 크기의 미로에 갇혀있다. 미로는 1×1 크기의 칸으로 이루어져 있고, 각 칸에는 정수가 하나 쓰여 있다. i번째 칸에 쓰여 있는 수를 Ai라고 했을 때, 재환이는 Ai이하만큼 오른쪽으로
www.acmicpc.net
문제 요약
재환이는 n개의 칸으로 이루어진 미로의 가장 왼쪽 끝 칸에 존재한다.
칸에 쓰여져 있는 수만큼 오른쪽으로 떨어진 칸으로 이동할 수 있을 때, 가장 오른쪽 끝 칸으로 이동할 수 있는 최소 점프 횟수를 출력한다.
가장 오른쪽 끝 칸으로 이동할 수 없는 경우 -1을 출력한다.
코드
from collections import deque
def min_jump(arr):
n = len(arr)
if n <= 1:
return 0
dp = [-1] * n
dp[0] = 0
# dp[i]는 i번째 칸까지 이동하는데 사용되는 점프 개수
queue = deque()
queue.append(0)
# deque를 이용한 BFS
while queue:
cur = queue.popleft()
for jump_size in range(1, arr[cur] + 1):
next_index = cur + jump_size
if next_index >= n: # 입력받은 배열의 인덱스를 초과하면
break
if dp[next_index] == -1: # 한 번 갱신된 dp는 다시 갱신 X
# i 칸까지 이동 방법이 많아도 최소 점프로 가는 방법이 먼저 dp[i]에 저장되기 때문
dp[next_index] = dp[cur] + 1 # dp 갱신
queue.append(next_index) # 큐에 다음 인덱스 추가
return dp[n - 1]
n = int(input())
arr = list(map(int, input().split()))
result = min_jump(arr)
print(result)
코드 설명
1. 0번째 칸부터 큐에 넣고 BFS 탐색을 진행한다.
+ (1 ~ 현재 칸에 적혀진 수 + 1) + 현재 인덱스 = 다음 인덱스
+ 입력 받은 배열의 인덱스를 초과하지 않도록 한다.
2 - 1. i 칸까지 이동하는데 사용되는 최소 점프 횟수를 저장하는 메모이제이션 테이블 dp를 이용한다.
2 - 2. 이미 갱신된 dp는 다시 갱신하지 않는다.
+ 넓이 우선 탐색 (BFS)를 이용하면 i 칸까지 이동 방법이 많아도 최소 점프로 가는 방법이 먼저 dp[i]에 저장된다.
'Algorithm Problems > 그래프' 카테고리의 다른 글
[백준/Python] 17471번: 게리맨더링 (1) | 2023.09.30 |
---|---|
[백준/Python] 1697번: 숨바꼭질 (1) | 2023.09.22 |
[백준/Python] 2606번: 바이러스 (0) | 2023.09.19 |
[Python/백준] 5639번: 이진 검색 트리 (2) | 2023.09.09 |
[Python/백준] 1991번: 트리 순회 (2) | 2023.09.08 |