Algorism/백준

[백준] 11060번 : 점프 점프 - JAVA [자바]

어린콩개발자 2024. 1. 3. 16:16

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

 

11060번: 점프 점프

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

www.acmicpc.net


문제

 

위 문제는 DP 풀이법으로 풀었다.

 

아래의 문제와 유사하다.

https://bean-conding.tistory.com/16

 

[백준] 11048번 : 이동하기- JAVA [자바]

https://www.acmicpc.net/problem/11048 11048번: 이동하기 준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고,

bean-conding.tistory.com

 

당연히 Memonization 기법을 통해서 DP 배열에 점프한 횟수의 최솟값을 비교하며 다음 DP칸에 저장했다.

하지만 채점결과 100%에서 틀렸다고 나왔고 한참을 고민한뒤에 내가 큰 실수를 했다는 것을 깨닫았다.

 

마지막 출력 코드에서 실수를 했다.


// 출발점 위치가 목적지인 경우
if(N == 1) {
	// 여기 부분을 System.out.println(1)이라고 했다......
   	System.out.println(0);
}
// 만약 마지막 DP 인덱스 값이 0이라면 갈 수 없음으로 -1출력
else if(DP[N - 1] == 0) {
   	System.out.println(-1);
 }
// 목적지까지 갈 수 있을 경우. 
 else {
   	System.out.println(DP[N - 1]);
 }

 

히든 케이스를 생각하며 출발지와 목적지가 같으면 -1을 출력하는 것을 보고 너무나 당연하게도 1로 출력하도록 만들었다.

하지만 출발지와 목적지가 같다면 점프할 일이 없기때문에 0을 출력해야된다.

 

이 문제가 코딩테스트 문제로 나왔다면 나는 아깝게 틀린것이다.

분하다. 다시는 이런 실수를 범하지 말아야겠다. 


전체 코드

package main;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;


public class Main {
	static int N;
	static int[] arr;
	static boolean[] possible;
	
	public static void main(String[] args) throws Exception {
    	System.setIn(new FileInputStream("input.txt"));
    	BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    	StringBuilder sb = new StringBuilder();
    	StringTokenizer st;
    	
    	N = Integer.parseInt(in.readLine());
    	arr = new int[N];
    	possible = new boolean[N];
    	
    	st = new StringTokenizer(in.readLine());
    	
    	for(int i = 0; i < N; i++) {
    		arr[i] = Integer.parseInt(st.nextToken());
    	}
    	
    	// DP 로직 시작.
    	int[] DP = new int[N];
    	possible[0] = true;
    	
    	for(int i = 0; i < N; i++) {
    		int step = arr[i];
    		
            // 현재 위치가 도달하기가 불가능하면 다음 블럭으로.
    		if(!possible[i]) continue;
    		
    		for(int j = 1; j <= step; j++) {
    			int next = i + j;
    			
    			if(next < N) {
    				possible[next] = true;
    				
    				if(DP[next] != 0) {
    					DP[next] = Math.min(DP[next], DP[i] + 1);
    				}
    				else {
    					DP[next] = DP[i] + 1;
    				}
    			}
    		}
    	}
    	
    	// 출발점 위치가 목적지인 경우
    	if(N == 1) {
    	   	System.out.println(0);
    	}
    	// 만약 마지막 DP 인덱스 값이 0이라면 갈 수 없음으로 -1출력
    	else if(DP[N - 1] == 0) {
    	   	System.out.println(-1);
    	 }
    	// 목적지까지 갈 수 있을 경우. 
    	 else {
    	   	System.out.println(DP[N - 1]);
    	 }
    }
}

 


결과