dp 문제입니다.
원형으로된 배열이 있고, 조건에 맞춰 원소를 뽑아 낼 때의 최댓값을 구하는 문제입니다.
하나의 원소를 뽑아낼 경우 양 쪽에 있는 원소는 뽑아낼 수 없습니다.
때문에 크게 두 가지로 구분될 수 있습니다.
- 첫 번째 원소를 뽑는 경우(원형이기 때문에, 마지막 원소는 뽑을 수 없습니다.)
- 첫 번째 원소를 뽑지 않는 경우
특정 위치를 i라고 했을 때에도 두 가지로 구분할 수 있습니다.
- 현재 위치를 뽑는 경우 : dp[i-2] + sticker[i]
- 현재 위치를 뽑지 않는 경우 : max(dp[i-1], dp[i-2])
[구현 코드]
class Solution {
private static int[] dp1, dp2;
public static int solution(int sticker[]) {
int n = sticker.length;
if(n==1) return sticker[0];
dp1 = new int[n];
dp2 = new int[n];
// 처음 뜯을 때 -> 마지막 뜯을 수 없음
dp1[0] = sticker[0];
dp1[1] = sticker[0]; // 세,네 번째 이후에 처음의 값이 포함되게 하기 위함임
for(int i=2; i<n-1; i++){
dp1[i] = Math.max(dp1[i-2]+sticker[i], Math.max(dp1[i-1], dp1[i-2]));
}
// 처음 뜯지 않을 때 -> 마지막 뜯을 수 있음
dp2[0] = 0;
dp2[1] = sticker[1];
for(int i=2; i<n; i++){
dp2[i] = Math.max(dp2[i-2]+sticker[i], Math.max(dp2[i-1], dp2[i-2]));
}
return Math.max(dp1[n-2], dp2[n-1]);
}
}
'알고리즘' 카테고리의 다른 글
프로그래머스 - 여행경로(Java) (0) | 2022.10.24 |
---|---|
프로그래머스 - 디스크 컨트롤러(Java) (2) | 2022.10.24 |
프로그래머스 - 섬 연결하기(Java) (0) | 2022.10.23 |
프로그래머스 - 가장 먼 노드(Java) (0) | 2022.10.23 |
프로그래머스 - 징검다리 건너기(Java) (0) | 2022.10.23 |