728x90
반응형
https://www.acmicpc.net/problem/11060
11060번: 점프 점프
재환이가 1×N 크기의 미로에 갇혀있다. 미로는 1×1 크기의 칸으로 이루어져 있고, 각 칸에는 정수가 하나 쓰여 있다. i번째 칸에 쓰여 있는 수를 Ai라고 했을 때, 재환이는 Ai이하만큼 오른쪽으로
www.acmicpc.net
문제 해결
- 판에 써져 있는 수 이하만큼 이동을 해서 최소한의 이동으로 끝까지 가는 문제
- 사실 bfs를 쓰고 이동을 1~판에 써져 있는 수 로 해서 바로 끝냈지만 메모리가 초과 되었다.(아무래도 MAX 이동 가능 거리가 100이기 때문에 많은 경우의 수가 deque로 들어가는 경우가 있기 때문)
- 그래서 어떻게 조건을 주어서 que에 들어가는 양을 줄일까 생각을 했는데 DP였다.
- DP로 이미 그 지점을 지난 최소 경우의 수와 비교했을 때 더 크면 쓸모가 없기 때문에 버린다.
- 더 좋은점은 움직인 횟수를 dp에 저장하기 때문에 편하게 쓸 수 있다.
CODE
import sys
input = sys.stdin.readline
INF = sys.maxsize
from collections import deque
def bfs(num):
global ans
que = deque()
que.append(num)
dp[num] = 0
while que:
now = que.popleft()
if now == n-1:
ans = min(ans,dp[n-1])
else:
for i in range(1,A[now]+1):
if now+i <n and dp[now+i] > dp[now]+1:
dp[now+i] = dp[now] + 1
que.append(now+i)
if __name__=='__main__':
n = int(input())
A = list(map(int, input().split()))
dp = [INF]*(n)
ans = INF
bfs(0) # 거꾸로 계산
print(ans if ans!=INF else -1)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 1508 레이스 (0) | 2023.04.16 |
---|---|
[python] 백준 1371 가장 많은 글자 (0) | 2023.04.14 |
[python] 백준 16562 친구비 (0) | 2023.04.13 |
[python] 백준 2258 정육점 (0) | 2023.04.13 |
[python] 백준 9526 1의 개수 세기 (0) | 2023.04.13 |
댓글