본문 바로가기
코딩테스트/BOJ

[백준] 9465번 - 스티커

by 의정부핵꿀밤 2022. 10. 13.
728x90

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

 

9465번: 스티커

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

www.acmicpc.net


DP를 이용해서 풀면 되는 문제다!

 

dp[i][j]는 i행 j열까지의 스티커를 떼어냈을 떄 얻을 수 있는 최대 점수를 저장하면 된다

 

이 때 인접한 스티커는 떼지 못하기 때문에 위의 그림처럼 대각선으로만 뗴어낼 수 있다

또 3칸이상 비교를 하게 되면 스티커를 뗴지 않은 칸이 발생하기 때문에 저렇게 색칠한 두 가지 중 큰 값을 골라 뗴면 된다

 

그리고 실제로 구현할 떄는 위의 점화식처럼 1칸 뒤와 2칸 뒤 중 큰 값을 선택해서 뗴어내면 된다!

 

 


 

자바 코드)

package boj;

import java.util.Scanner;

public class boj9465 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        while(t>0) {
            t--;
            int n = scanner.nextInt();
            int[][] arr = new int[2][n+1];
            int[][] dp = new int[2][n+1];
            for(int i=0;i<2;i++) {
                for(int j=1;j<=n;j++) {
                    arr[i][j] = scanner.nextInt();
                }
            }

            dp[0][1] = arr[0][1];
            dp[1][1] = arr[1][1];
            for(int j=2;j<n+1;j++) {
                dp[0][j] = Math.max(dp[1][j-1], dp[1][j-2]) + arr[0][j];
                dp[1][j] = Math.max(dp[0][j-1], dp[0][j-2]) + arr[1][j];
            }
            System.out.println(Math.max(dp[0][n], dp[1][n]));
        }
    }
}

참고)

https://loosie.tistory.com/451

 

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

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

loosie.tistory.com

 

728x90

'코딩테스트 > BOJ' 카테고리의 다른 글

[백준] 2225번 - 합분해  (0) 2022.11.03
[백준] 2156번 - 포도주 시식  (1) 2022.10.13
[백준] 10825번 - 국영수  (0) 2022.09.29
[백준] 11650번 - 좌표 정렬하기  (0) 2022.09.28
[BOJ] 2751번 - 수 정렬하기 2  (0) 2022.09.28

댓글