Dynamic Programming

Seoyeon·2025년 11월 10일

코딩테스트

목록 보기
2/4
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        // 1. 계단 점수를 저장할 배열 (1번부터 n번까지 사용)
        int[] scores = new int[n + 1]; 
        
        // 2. i번째 계단까지의 최대 점수를 저장할 DP 배열
        int[] dp = new int[n + 1];

        // n개의 계단 점수를 입력받아 scores 배열에 저장
        for (int i = 1; i <= n; i++) {
            scores[i] = scanner.nextInt();
        }

        // 3. DP의 시작점 (Base Case) 설정
        
        // dp[1] = 1번째 계단까지의 최대 점수 (자기 자신)
        dp[1] = scores[1];

        // n=1일 수도 있으므로, n이 2 이상일 때만 dp[2]를 계산
        if (n >= 2) {
            // dp[2] = 2번째 계단까지의 최대 점수 (1번 + 2번)
            dp[2] = scores[1] + scores[2];
        }

        // 4. 점화식을 이용해 3번째 계단부터 n번째 계단까지 계산
        for (int i = 3; i <= n; i++) {
            // 경우 1: (i-2) -> i 로 2칸 점프 (항상 안전)
            int case1 = dp[i-2] + scores[i];
            
            // 경우 2: (i-3) -> (i-1) -> i 로 1칸 점프 (3연속 방지)
            int case2 = dp[i-3] + scores[i-1] + scores[i];

            // 두 경우 중 더 큰 값을 저장
            dp[i] = Math.max(case1, case2);
        }

        // 5. 마지막 계단(n)까지의 최대 점수를 출력
        System.out.println(dp[n]);
        
        scanner.close();
    }
}

0개의 댓글