‡ CODING TEST STUDY ‡/º 백준
[백준 | Java Silver I] (#9465) 스티커
Trudy | 송연
2024. 7. 19. 13:09
문제
https://www.acmicpc.net/problem/9465
최종 코드
package week11.baek.july19.baek;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class S9465 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
int n = Integer.parseInt(br.readLine());
int[][] sticker = new int[2][n];
for (int j = 0; j < 2; j++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int k = 0; k < n; k++) {
sticker[j][k] = Integer.parseInt(st.nextToken());
}
}
// dp[i][j] : i행 j열까지 스티커를 떼었을 때 얻을 수 있는 최대 점수
int[][] dp = new int[2][n];
dp[0][0] = sticker[0][0];
dp[1][0] = sticker[1][0];
// n=1이라면 두번째 열 초기화가 필요 없기 때문
if (n > 1) {
//첫번째 줄 두번째 열까지 스티커를 뗐을 때 (대각선 왼쪽 아래)
dp[0][1] = sticker[1][0] + sticker[0][1];
//두번째 줄 두번째 열까지 스티커를 뗐을 때 (대각선 왼쪽 위)
dp[1][1] = sticker[0][0] + sticker[1][1];
}
for (int j = 2; j < n; j++) {
// 윗 줄 - 현재 값 + 대각선 왼쪽 아래 또는 왼쪽 두 칸 아래에서 오는 최대값
dp[0][j] = sticker[0][j] + Math.max(dp[1][j-1], dp[1][j-2]);
// 아랫 줄 - 현재 값 + 대각선 왼쪽 위 또는 왼쪽 두 칸 위에서 오는 최대값
dp[1][j] = sticker[1][j] + Math.max(dp[0][j-1], dp[0][j-2]);
}
int max = Math.max(dp[0][n-1], dp[1][n-1]);
System.out.println(max);
}
}
}