본문 바로가기
알고리즘/백준

백준 9456번 - 스티커(Java)

by latissimus 2022. 3. 31.

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

 

9465번: 스티커

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의

www.acmicpc.net

코드 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int[][] dp;
    static int[][] score;

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

        StringTokenizer st;
        int T = Integer.parseInt(br.readLine());

        while(T-- > 0){
            int n = Integer.parseInt(br.readLine());

            // dp[i][n]는 n번째 열에서 i의 상황에 n번째 열까지 스티커 점수합의 최댓값
            // 0: 위 떼는 경우, 1: 아래 떼는 경우
            dp= new int[2][n+1];
            
            // score[][]입력값 받는 배열
            // 0이 위, 1이 아래
            score= new int[2][n+1];

            for (int i = 0; i < 2; i++) {
                st = new StringTokenizer(br.readLine());

                for (int j = 1; j <= n; j++) {
                    score[i][j] = Integer.parseInt(st.nextToken());
                }
            }

            dp[0][1] = score[0][1]; // 위에 인덱스0 값 초기화
            dp[1][1] = score[1][1]; // 아래 인덱스0 값 초기화

            for (int i = 2; i <= n; i++) {
                dp[0][i] = Math.max(dp[1][i - 2], dp[1][i-1]) + score[0][i];
                dp[1][i] = Math.max(dp[0][i - 2], dp[0][i-1]) + score[1][i];
            }
            sb.append(Math.max(dp[0][n], dp[1][n])).append("\n");
        }
        System.out.println(sb);
    }

}

 

 

댓글