알고리즘
프로그래머스 스티커 모으기(2) (JAVA)
박카스마시며코딩
2022. 6. 3. 13:25
https://programmers.co.kr/learn/courses/30/lessons/12971
코딩테스트 연습 - 스티커 모으기(2)
N개의 스티커가 원형으로 연결되어 있습니다. 다음 그림은 N = 8인 경우의 예시입니다. 원형으로 연결된 스티커에서 몇 장의 스티커를 뜯어내어 뜯어낸 스티커에 적힌 숫자의 합이 최대가 되도록
programmers.co.kr
저는 해당 문제를 DP를 이용해 문제를 해결하였습니다.
저는 첫번째의 값을 포함하고 있는지 안 포함하는지에 따라 다르게 DP를 저장하였습니다.
이유는 첫번째의 값을 포함하게 되면 마지막의 값을 포함할 수 없기 때문입니다.
import java.util.*;
class Solution {
private static final int INCLUDE_FIRST = 0;
private static final int NOT_INCLUDE_FIRST = 1;
public int solution(int sticker[]) {
int answer = 0;
int size = sticker.length;
if(size == 1){
return sticker[0];
}
int[][] dp = new int[2][size];
dp[INCLUDE_FIRST][0] = sticker[0];
dp[INCLUDE_FIRST][1] = Math.max(sticker[0], sticker[1]);
dp[NOT_INCLUDE_FIRST][1] = sticker[1];
for(int i = 2 ; i < size ; i++){
if(i != size-1){
dp[INCLUDE_FIRST][i] = Math.max(dp[INCLUDE_FIRST][i-1], dp[INCLUDE_FIRST][i-2] + sticker[i]);
}
dp[NOT_INCLUDE_FIRST][i] = Math.max(dp[NOT_INCLUDE_FIRST][i-1], dp[NOT_INCLUDE_FIRST][i-2] + sticker[i]);
}
// System.out.println(Arrays.toString(dp[INCLUDE_FIRST]));
// System.out.println(Arrays.toString(dp[NOT_INCLUDE_FIRST]));
answer = Math.max(dp[INCLUDE_FIRST][size-2],dp[NOT_INCLUDE_FIRST][size-1]);
return answer;
}
}