[Java] 9465번: 스티커 Silver 1

상곤·2025년 5월 22일

Dynamic Programming

목록 보기
23/32
post-thumbnail

문제 링크

거의 바로 풀렸다!

이 문제도 계단 오르기와 매우 비슷한 느낌이었다.
바로 전의 것을 고르면 대각선의 것만 고를 수 있다는 점이, 연속해서 계단을 밟을 수 없는 계단 오르기와 비슷한 느낌이었다.
다만 이건 2차원 배열이라서 선택지가 하나 더 생긴다는 점이 달랐다.

그거 말고는 너무 익숙한 느낌이라서 바로 방법을 떠올리고, 바로 코드를 작성할 수 있었다!

정답

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // T 입력 받기
        int T = Integer.parseInt(br.readLine());

        for (int t = 0; t < T; t++) {

            // N 입력 받기
            int N = Integer.parseInt(br.readLine());

            // 점수 입력 받기
            int[][] dp = new int[2][N];
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                dp[0][j] = Integer.parseInt(st.nextToken());
            }
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                dp[1][j] = Integer.parseInt(st.nextToken());
            }

            // dp
            dp[0][1] += dp[1][0];
            dp[1][1] += dp[0][0];
            for (int j = 2; j < N; j++) {
                dp[0][j] += Math.max(dp[1][j - 1], Math.max(dp[0][j - 2], dp[1][j - 2]));
                dp[1][j] += Math.max(dp[0][j - 1], Math.max(dp[0][j - 2], dp[1][j - 2]));
            }

            // 출력
            System.out.println(Math.max(dp[0][N - 1], dp[1][N - 1]));
        }
    }
}


예외 처리를 해주어야 한다..!


이렇게..😅

진짜 정답

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // T 입력 받기
        int T = Integer.parseInt(br.readLine());

        for (int t = 0; t < T; t++) {

            // N 입력 받기
            int N = Integer.parseInt(br.readLine());

            // 점수 입력 받기
            int[][] dp = new int[2][N];
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                dp[0][j] = Integer.parseInt(st.nextToken());
            }
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                dp[1][j] = Integer.parseInt(st.nextToken());
            }

            // 예외 처리
            if (N == 1) {
                System.out.println(Math.max(dp[0][0], dp[1][0]));
            } else {
                // dp
                dp[0][1] += dp[1][0];
                dp[1][1] += dp[0][0];
                for (int j = 2; j < N; j++) {
                    dp[0][j] += Math.max(dp[1][j - 1], Math.max(dp[0][j - 2], dp[1][j - 2]));
                    dp[1][j] += Math.max(dp[0][j - 1], Math.max(dp[0][j - 2], dp[1][j - 2]));
                }

                // 출력
                System.out.println(Math.max(dp[0][N - 1], dp[1][N - 1]));
            }
        }
    }
}
profile
🫠

0개의 댓글