[백준] 9465번 스티커
문제링크: 백준 9465번 스티커
- 
    
아이디어
 
왼쪽부터 오른쪽으로 가면서 스티커 크기와 동일한 DP배열을 가지고 가면서 최대 값을 계속 계산해간 후, 마지막에서 최대값을 출력함.
[테스트 케이스]
50 10 100 20 40
30 50  70 10 60
- 
    
예외처리
- 열이 1개인 경우, 첫째 열의 첫 번째와 두 번째 값 중 최대값 출력.
 - 열이 2개인 경우, 첫째 열의 첫 번째와 둘째 열의 두 번째 값, 첫째 열의 두 번째 값과 둘째 열의 첫 번째 값(즉, 대각선) 중 최대값 출력.
 
 - 
    
열이 3개인 경우부터 DP배열에서 계산
- 
        
100 스티커가 있는 자리에는
- 50(1열) - 50(2열) 스티커 선택한 경우, 즉 
dp[1][1] - 30(1열) - 0(2열 선택 안함) 스티커 선택한 경우, 즉 
dp[0][1] 
중 최대 값이 오게 됨.
 - 50(1열) - 50(2열) 스티커 선택한 경우, 즉 
 - 
        
70 스티커가 있는 자리에는 그 반대의 경우가 됨.
 
 - 
        
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
    static int[][] sticker;
    static int[][] dp;
    static int times;
    static int width;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        times = Integer.parseInt(st.nextToken());
        for (int i = 0; i < times; i++) {
            st = new StringTokenizer(br.readLine());
            width = Integer.parseInt(st.nextToken());
            dp = new int[2][width];
            sticker = new int[2][width];
            for (int j = 0; j < 2; j++) {
                st = new StringTokenizer(br.readLine());
                for (int k = 0; k < width; k++) {
                    sticker[j][k] = Integer.parseInt(st.nextToken());
                }
            }
            if(width == 1) {
                System.out.println(Math.max(sticker[0][0], sticker[1][0]));
                continue;
            }
            dp[0][0] = sticker[0][0];
            dp[1][0] = sticker[1][0];
            dp[0][1] = dp[1][0] + sticker[0][1];
            dp[1][1] = dp[0][0] + sticker[1][1];
            if(width == 2) {
                System.out.println(Math.max(dp[0][1], dp[1][1]));
                continue;
            }
            for (int j = 2; j < width; j++) {
                dp[0][j] = Math.max(dp[1][j-1], dp[1][j-2]) + sticker[0][j];
                dp[1][j] = Math.max(dp[0][j-1], dp[0][j-2]) + sticker[1][j];
            }
            System.out.println(Math.max(dp[0][width - 1], dp[1][width - 1]));
        }
    }
}
- 
    
학습내용
- 
        
선택하고, 선택하지 않고 등이 번갈아가면서 길게 이어지는 경우에는
DP배열을 활용하여 문제 접근이 가능! - 
        
큰 문제를 부분 문제로 나눈 후 답을 찾아가는 과정!!
 
 - 
        
 
마지막 수정일시: 2022-11-22 14:35
      
댓글남기기