새소식

PS/백준

[백준/11060] 점프 점프 (Python)

  • -

Problem : https://www.acmicpc.net/problem/2631

 

Difficulty  : Silver 2

 

Status : Solved

 

Time : 00:02:51

 


 

문제 설명

 

더보기


재환이가 1×N 크기의 미로에 갇혀있다. 미로는 1×1 크기의 칸으로 이루어져 있고, 각 칸에는 정수가 하나 쓰여 있다. i번째 칸에 쓰여 있는 수를 Ai라고 했을 때, 재환이는 Ai이하만큼 오른쪽으로 떨어진 칸으로 한 번에 점프할 수 있다. 예를 들어, 3번째 칸에 쓰여 있는 수가 3이면, 재환이는 4, 5, 6번 칸 중 하나로 점프할 수 있다.

재환이는 지금 미로의 가장 왼쪽 끝에 있고, 가장 오른쪽 끝으로 가려고 한다. 이때, 최소 몇 번 점프를 해야 갈 수 있는지 구하는 프로그램을 작성하시오. 만약, 가장 오른쪽 끝으로 갈 수 없는 경우에는 -1을 출력한다.

 

 

입력 및 출력

 

더보기

입력

 

첫째 줄에 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 Ai (0 ≤ Ai ≤ 100)가 주어진다.

 

출력

 

재환이가 최소 몇 번 점프를 해야 가장 오른쪽 끝 칸으로 갈 수 있는지 출력한다. 만약, 가장 오른쪽 끝으로 갈 수 없는 경우에는 -1을 출력한다.

 

입력 예시

 

10
1 2 0 1 3 2 1 5 4 2

 

출력 예시

 

5

 

 


 

풀이

 

1차원 배열 DP 문제. 현재 i번째 칸에 도달하기 위한 최소 점프 횟수를 DP[i]라고 두고, 현재 발판의 숫자를 NUM[i]로 두자. i부터 i+NUM[i]까지의 영역에 점프를 할 수 있고, 각 발판의 최소 점프 횟수 DP[i+j]는 만약 DP[i]+1이 더 작다면 업데이트된다.

 

혹은, 최대 N이 1000이므로 이를 경로 탐색 문제로 보고 풀이해봐도 되겠다.

 

풀이 코드

MAX = float('inf')
N = int(input())
map_list = list(map(int, input().split()))
dp = [MAX]*N
dp[0] = 0

for i in range(N) :
  if dp[i] == MAX :
    continue
  for j in range(map_list[i]) :
    if i+j+1 > N-1 :
      break
    dp[i+j+1] = min(dp[i+j+1], dp[i] + 1)

print(dp[-1] if dp[-1] < MAX else -1)

 

풀이 완료!

'PS > 백준' 카테고리의 다른 글

[백준/2229] 조 짜기 (Python)  (0) 2023.08.10
[백준/20541] 앨범정리 (Python)  (0) 2023.08.05
[백준/2631] 줄세우기 (Python)  (0) 2023.08.03
[백준/2210] 숫자판 점프 (Python)  (0) 2023.07.28
[백준/20437] 문자열 게임 2 (Python)  (0) 2023.07.27
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.