Programming/백준
[실버 2] 백준 11060 - 점프 점프 (파이썬)
pental
2025. 4. 27. 17:20

https://www.acmicpc.net/problem/11060
풀이
- 각 칸마다 점프할 수 있는 최대 칸 수가 주어짐
- 0번 인덱스부터 시작해서 N-1번 인덱스로 가야 함
- 최소 몇 번의 점프로 도달할 수 있는지 구함
- 못 가면 -1 출력
N = int(input()) # 칸의 수
A = list(map(int ,input().split())) # 각 칸에서 점프 가능한 최대 거리
A[i]는 i번 칸에서 최대 A[i]칸 까지 점프가 가능하다는 뜻을 의미한다.
D = [1e9] * N # DP 배열, 최소 점프 횟수를 저장 (초기값은 매우 큰 값)
D[N - 1] = 0 # 마지막 칸은 도달했으므로 점프 횟수 0
for i in range(N - 2, -1, -1): # 뒤에서부터 탐색
for j in range(1, A[i] + 1): # 점프 가능한 거리만큼
if i + j >= N:
break # 범위 넘어가면 종료
D[i] = min(D[i], 1 + D[i + j]) # 다음 칸까지 최소 점프 갱신
뒤에서 부터 역방향으로 최솟값을 갱신한다.
예를 들어서 입력값이 다음과 같다.
6
2 0 1 0 1 0
- 0번에서 최대 2칸 점프 가능 → 1번 or 2번 이동 가능
- 1번은 0 → 이동 불가
- 2번은 1칸 → 3번 이동 가능
- 3번은 0 → 이동 불가
- 4번은 1칸 → 5번 이동 가능
- 5번은 0 → 마지막 칸 도달
코드
# 백준 11060 - 점프 점프
# 분류 : 다이나믹 프로그래밍
N = int(input())
A = list(map(int ,input().split()))
D = [1e9] * N
D[N - 1] = 0
for i in range(N - 2, -1, -1) :
D[i] = 1e9
for j in range(1, A[i] + 1) :
if i + j >= N :
break
D[i] = min(D[i], 1 + D[i + j])
if D[0] == 1e9 :
print(-1)
else :
print(D[0])