알고리즘

[백준 11060] 점프 점프 - 자바(JAVA)

사랑박 2023. 8. 10. 22:40

1. 문제

https://www.acmicpc.net/problem/11060

 

11060번: 점프 점프

재환이가 1×N 크기의 미로에 갇혀있다. 미로는 1×1 크기의 칸으로 이루어져 있고, 각 칸에는 정수가 하나 쓰여 있다. i번째 칸에 쓰여 있는 수를 Ai라고 했을 때, 재환이는 Ai이하만큼 오른쪽으로

www.acmicpc.net

 

2. 풀이

`DP`로 문제를 풀었습니다.
dp배열은 해당 칸까지 가는데 걸리는 최소 점프 횟수입니다.
만약에 data[3]=3이고 dp[3]=2라면
3번째 칸 까지 가는 최소 점프 횟수는 2번인데
3번째 칸에서 4, 5, 6칸을 갈 수 있는데 점프를 하니까 3번(dp[3]+1)만에 갈 수 있습니다.
최소면 갱신하고 아니라면 무시하면 됩니다.
이렇게 최솟값을 갱신하면서 dp[0]부터 dp[N-1]까지 차례대로 구해주었습니다.

 

DP외에도 BFS, DFS 등 다양한 풀이 방법이 있는 것 같은데 나중에 시간이 된다면 다른 알고리즘으로 다시 풀어봐야 겠습니다ㅎㅎ

3. 코드

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;

public class BOJ11060 {

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

		int N=Integer.parseInt(br.readLine());
		int[] data=new int[N];
		int[] dp=new int[N];

		String[] input=br.readLine().split(" ");

		for(int i=0;i<N;i++) {
			data[i]=Integer.parseInt(input[i]);
			dp[i]=Integer.MAX_VALUE;
		}

    		// 첫 번째 칸이 0이면 종료
		if(N>=1 && data[0]==0) {
			System.out.println(-1);
			return;
		}

		dp[0]=0;

		for(int i=0;i<N-1;i++) {
			if(data[i]==0||dp[i]==Integer.MAX_VALUE) { // 다음칸으로 점프할 수 없음 || 오는 길이 없음
				continue;
			}
			for(int j=1;j<=data[i];j++) { // 점프할 수 있는 만큼 가보자
				if(i+j>=N) break; // 인덱스 벗어나면 종료
				dp[i+j]=Math.min(dp[i+j], dp[i]+1);
			}
		}

		if(dp[N-1]==Integer.MAX_VALUE) {
			System.out.println(-1);
		}else {
			System.out.println(dp[N-1]);
		}
	}
}