코테/백준

[백준/JAVA] 9465번: 스티커

imname1am 2024. 1. 20. 01:26
반응형

📖 문제

 

9465번: 스티커

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

www.acmicpc.net

 

 

 

💡  풀이 방식

• DP

  1. dp 배열을 만든다. (dp[i][j] : 해당 칸 (i, j)까지 스티커를 떼었을 때 얻을 수 있는 최대 점수)

   2. 0번 열은 본인이 최대이므로 본인으로 초기화한다.

   3. 1번 열은 특수처리한다.

  • [0][1]은 왼쪽 아래 값과 본인 칸 값 더하기
  • [1][1]은 왼쪽 위쪽 값과 본인 칸 값 더하기
dp[0][1] = dp[1][0] + arr[0][1];
dp[1][1] = dp[0][0] + arr[1][1];

 

 

   4. 2번 열부터 뒤쪽까지는 아래와 같은 방식으로 채운다..

dp[0][i] = Math.max(dp[1][i - 1], dp[1][i - 2]) + arr[0][i];
dp[1][i] = Math.max(dp[0][i - 1], dp[0][i - 2]) + arr[1][i];

 

 

 5. 마지막 열의 두 값 중 큰 값을 구해 출력한다.

 

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        StringBuilder sb = new StringBuilder();
        
        int T = Integer.parseInt(br.readLine());
        while(T --> 0) {
            int n = Integer.parseInt(br.readLine());
            int[][] arr = new int[2][n];
            int[][] dp = new int[2][n];
            
            for(int i = 0 ; i < 2 ; i++) {
                st = new StringTokenizer(br.readLine());
                for(int j = 0 ; j < n ; j++) {
                    arr[i][j] = Integer.parseInt(st.nextToken());
                }
            }
            
            // 0번 열은 본인이 최대이므로 본인으로 초기화
            dp[0][0= arr[0][0];
            dp[1][0= arr[1][0];
            
            for(int i = 1 ; i < n ; i++) {
                if(i == 1) {    // 1번 열은 특수처리
                    dp[0][i] = dp[1][0+ arr[0][1];
                    dp[1][i] = dp[0][0+ arr[1][1];
                    continue;
                }
                
                dp[0][i] = Math.max(dp[1][i - 1], dp[1][i - 2]) + arr[0][i];
                dp[1][i] = Math.max(dp[0][i - 1], dp[0][i - 2]) + arr[1][i];
            }
            
            sb.append(Math.max(dp[0][n - 1], dp[1][n - 1])).append("\n");
        }
        
        System.out.println(sb);
    }
}
 
cs

 


🧐 새로 알게 된 내용

저 dp 규칙을 찾고 점화식을 세우는 방법을 새로 깨닫다...

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[알고리즘] 백준 9465 스티커 -dp- 자바

www.acmicpc.net/problem/9465 9465번: 스티커 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정

youngest-programming.tistory.com

 

[BOJ] 백준 9465번 스티커 (Java)

#9465 스티커 난이도 : 실버 2 유형 : DP 9465번: 스티커 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가

loosie.tistory.com

 

반응형