문제
원형으로 된 스티커판이 있고 각 스티커판에는 점수가 적혀있다. 하지만 한 스티커를 뗀다면 양쪽 두 스티커는 뗄수 없다. 이 때, 스티커를 뽑아 만들 수 있는 최대값을 구하라.
로직
이 문제는 프로그래머스의 도둑질과 거의 똑같은 문제이다. 사실 값들만 다르고 같은 로직을 사용한다.
하지만 기억이 나지 않았고 기억을 위해 기록해 외워 두려고 한다.
1. 두 배열 생성
1-1. Arrays.copyOfRange(array, 0, len-2);
1-2. Arrays.copyOfRange(array, 1, len-1);
2. 두 배열 합치기
int[][] list = {list1, list2};
3. 배열마다 확인하며 dp처리
4. 각 배열마다 마지막 값들 중 최대값이 정답
코드
import java.util.*;
class Solution {
public int solution(int sticker[]) {
int answer = 0;
int len = sticker.length;
if(len <= 1){
return sticker[0];
}
if(len <= 2){
answer = Math.max(sticker[0], sticker[1]);
return answer;
}
int[] check1 = Arrays.copyOfRange(sticker, 0, len-1);
int[] check2 = Arrays.copyOfRange(sticker, 1, len);
int[][] check = {check1, check2};
for(int[] now : check){
int[] dp = new int[len-1];
dp[0] = now[0];
dp[1] = Math.max(now[1], dp[0]);
for(int i=2; i<len-1; i++){
dp[i] = Math.max(now[i]+dp[i-2], dp[i-1]);
}
answer = Math.max(answer, dp[len-2]);
}
return answer;
}
}
import java.util.*;
class Solution {
public int solution(int sticker[]) {
int answer = 0;
int length = sticker.length;
if(length == 1){
return sticker[0];
}
if(length == 2){
return Math.max(sticker[0], sticker[1]);
}
int[] arrayA = Arrays.copyOfRange(sticker, 0, length-1);
int[] dpA = new int[length-1];
dpA[0] = arrayA[0];
dpA[1] = Math.max(arrayA[1], dpA[0]);
for(int i=2; i<length-1; i++){
dpA[i] = Math.max(dpA[i-1], dpA[i-2]+arrayA[i]);
}
int[] arrayB = Arrays.copyOfRange(sticker, 1, length);
int[] dpB = new int[length-1];
dpB[0] = arrayB[0];
dpB[1] = Math.max(arrayB[1], dpB[0]);
for(int i=2; i<length-1; i++){
dpB[i] = Math.max(dpB[i-1], dpB[i-2]+arrayB[i]);
}
return Math.max(dpA[length-2], dpB[length-2]);
}
}
'Algorithm > Practice' 카테고리의 다른 글
Programmers - 자물쇠와 열쇠 with JAVA (0) | 2023.06.28 |
---|---|
XOR 연산 with JAVA (0) | 2023.06.27 |
Programmers - 메뉴 리뉴얼 with JAVA (0) | 2023.06.21 |
Programmers - 2개 이하로 다른 비트 with JAVA (V) (0) | 2023.06.15 |
Programmers - 뒤에 있는 큰 수 찾기 with JAVA (V) (0) | 2023.06.14 |