Algorithm

[BOJ_2579]계단오르기(실버 3) - JAVA

이수밈 2024. 1. 7. 22:16

DP특집


    🐾 알고리즘

    • 동적계획법
    • dp 배열이 i번째까지 올라갔을 때의 최고 점수가 갱신하는 과정을 담은 것임을 잊지말자.

    🐾 생각 포인트

    • 아래 부분에서 생각을 오래했다. 그래서 동적계획법에 대해 더 이해하게 되었다..!
    for(int i=4;i<N+1;i++){
        //i==4일때, dp[i-3]+stairs[i-1]은 1번계단, 3번계단을 오른 경우고,
        //dp[i-2]는 1번계단과 2번계단을 오른 경우다.
        dp[i] = Math.max(dp[i-3]+stairs[i-1], dp[i-2])+stairs[i];
    }

     

    • 그리고 dp[1] 과  dp[2] 일때는 정해져있는 값이다.
    • ArrayIndexOutOfBound 오류가 난다면 n==1일때나 n==2, n==3일때 에러가 난다는 점이니 조건을 잘 설정해주고 System.exit를 시켜주자.(사실 exit을 시켜주는게 맞는지는 확실하지 않다.)

    🐾 소스코드

    import java.io.*;
    import java.util.*;
    
    public class Main {
        static int[] stairs;
        static int N;
        static int ans;
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            N = Integer.parseInt(br.readLine());
            stairs = new int[N+1];
            int[] dp = new int[N+1];
            for(int i=1;i<=N;i++){
                stairs[i] = Integer.parseInt(br.readLine());
            }
    
            dp[1] = stairs[1];
            if(N==1){
                System.out.println(dp[1]);
                System.exit(0);
            }
            dp[2] = stairs[1]+stairs[2];
            if(N==2){
                System.out.println(dp[2]);
                System.exit(0);
            }
    
            dp[3] = Math.max(stairs[1],stairs[2]) + stairs[3];
            if(N==3){
                System.out.println(dp[3]);
                System.exit(0);
            }
    
            for(int i=4;i<N+1;i++){
                //i==4일때, dp[i-3]+stairs[i-1]은 1번계단, 3번계단을 오른 경우고,
                //dp[i-2]는 1번계단과 2번계단을 오른 경우다.
                dp[i] = Math.max(dp[i-3]+stairs[i-1], dp[i-2])+stairs[i];
            }
    //        System.out.println(Arrays.toString(dp));
            System.out.println(dp[N]);
    
    
        }
    
    
    
    }

    😵‍💫 공부해야 할 점

    • DP 문제가  알고리즘  대세라고 하니 열심히 공부할  것.
    • 깊이 공부할 것.