ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 11060 점프 점프
    백준/DP 다이나믹 프로그래밍 2022. 5. 22. 15:17

     

    1. 풀이

     

    문제에서 주어진 예시를 가지고 설명하겠다.

     

    10
    1 2 0 1 3 2 1 5 4 2

     

    input 배열에 입력값을 입력한다.

    1 2 0 1 3 2 1 5 4 2 => input 배열에 입력

     

    dp[i] 배열값은 첫번째 위치에서 i 번째까지 점프한 횟수이다.

     

     

    1) i = 0 

    dp[0] = 0 

    첫번째 칸은 시작 칸으로 이동이 없으므로 0으로 초기화된다.

    input[0] = 1 이므로, 오른쪽으로 한 칸 점프 가능하다.

    => i = 1 위치까지 점프

     

    2) i = 1

    dp[0] 에서 점프가 1번 더해졌으므로

    dp[1] = dp[0] + 1 =1

     

    input[1] = 2이므로, 오른쪽으로 한 칸, 두 칸까지 이동 가능하다.

    => i = 2, 3까지 이동

     

    3) i = 2

    dp[2] = dp[1] + 1 = 2

    input[2] = 0 이다.

    => 오른쪽으로 점프 불가능.

     

    4) i = 3

    dp[3] = dp[1] + 1 = 2

    input[3] = 1

    => i = 4 까지 이동.

     

    이런식으로 dp 값을 채워주고, 정답으로 dp[N-1] 값을 출력하면 된다.

     

     

    2. 주의할 점 

     

    위의 과정을 하다보면, 

     

    i= 4 일때,

    dp[4] = 3 이다.

    input[4] = 3 이므로,

    => i = 5,6,7 까지 이동 가능하다.

     

    그러면 

    dp[5] = dp[4] + 1 = 4

    dp[6] = dp[4] + 1 = 4 

    dp[7] = dp[4] + 1 = 4

    이 될 것이다.

     

    그런데,

    i = 5 일때,

    input[5] = 2 이므로,

    i = 6, 7 까지 이동 가능하다.

     

    그러면

    dp[6] = dp[5] + 1 = 5

    dp[7] = dp[5] + 1 = 5 가 된다.

     

    즉, 위의 i = 4 일때 입력한 dp[6], dp[7] 값이 다시 새로운 값으로 채워지게 된다.

    그런데 문제에서 최소 점프를 통해 가장 오른쪽 끝 칸으로 가라고 했으므로

    더 작은 값, 즉 dp[6] = dp[4] +1 = 4 가 되어야 한다.

    그래서, dp값이 이미 채워져 있다면, 즉 0이 아니라면 dp 값을 새롭게 채우지 못하도록 했다.

     

    3. 최종 코드

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    
    public class Main {
    	
    	public static void main(String[] args) throws IOException {
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		int N = Integer.parseInt(br.readLine());
    		StringTokenizer st = new StringTokenizer(br.readLine(), " " );
    		int input [] = new int[N];
    		
    		for(int i=0; i<N;i++ ) {
    			input[i] = Integer.parseInt(st.nextToken());
    		}
    		
    		int dp[] = new int[N];
    		dp[0] = 0;
    	
    		
    		if(N ==1 && input[0] ==0) {
    			System.out.println(0);
    			return;
    		}
    		
    		int i = 0;
    		
    		solve :
    		while(i<N-1) {
    	
    			for(int j =i+1; j<=i+input[i]; j++) {
    			
    				if(j>=N) {
    			
    					break solve;
    				}
    	
    				if(dp[j]==0) {
    					dp[j] = dp[i] + 1;
    				}
    			}
    		
    			if(input[i] == 0 && dp[i+1] ==0) {
    				break solve;
    			}
    		
    			i++;
    		}
    		
    		
    		if(dp[N-1] ==0 ) {
    			System.out.println(-1);
    		}else {
    			System.out.println(dp[N-1]);
    		}
    		
    	}
    }

    '백준 > DP 다이나믹 프로그래밍' 카테고리의 다른 글

    1915 가장 큰 정사각형  (0) 2024.06.26
    10164 격자상의 경로  (0) 2022.05.22
    11048 이동하기  (0) 2022.05.17
    가장 긴 증가하는 부분 수열 11053  (0) 2022.02.08
    11057 오르막 수  (0) 2021.10.26

    댓글

Designed by Tistory.