코딩테스트 연습
[Java] 백준 9465 스티커 / DP 쉬운 예제
콩콩(๓° ˘ °๓)♡
2024. 2. 7. 22:32
import java.util.*;
import java.io.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
public static void main(String[] args) throws NumberFormatException, IOException {
int T = Integer.parseInt(br.readLine()); //입력되는 테스트케이스 개수
for (int i = 0; i < T; i++) {
int n = Integer.parseInt(br.readLine());
int[][] map = new int[2][n+1];
for (int j = 0; j < 2; j++) {
st = new StringTokenizer(br.readLine());
for (int k = 1; k <= n; k++) { //맨 앞칸을 띄우고 입력받음(이유는 뒤에)
map[j][k] = Integer.parseInt(st.nextToken());
}
}
int[][] dp = new int[2][n+1];
dp[0][1] = map[0][1]; //첫칸을 구성하는 최대의 합은 자기자신
dp[1][1] = map[1][1];
for (int j = 2; j <= n; j++) {
dp[0][j] = map[0][j]+Math.max(dp[1][j-1],dp[1][j-2]); //다음 칸에 도달 할 수 있는 방법은 대각선 or 대각선 이전칸 뿐
dp[1][j] = map[1][j]+Math.max(dp[0][j-1],dp[0][j-2]); //이 과정에서 두번째 dp칸 예외를 허용해주기 위해 map 입력을 첫 칸 띄우고 받음
}
System.out.println(Math.max(dp[0][n], dp[1][n]));
}
}
}
1. dp를 푸는 요령은 각 단계를 구성하는 최소 단계를 찾는 것임
2. 어떠한 방법으로도 합쳐질 수 없는 최소 단위를 반복해 누적하면서 불필요한 단계를 줄이고 빠르게 답에 도달한다
9465번: 스티커
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의
www.acmicpc.net