[프로그래머스] 스티커 모으기(2) - JAVA
https://school.programmers.co.kr/learn/courses/30/lessons/12971
풀이
원형으로 된 스티커가 있고, 어느 한 칸을 떼면 양 옆의 칸에 있는 스티커는 뗄 수 없다.
이때, 스티커를 떼어 얻을 수 있는 최댓값을 구하는 문제이다.
배열의 길이가 100,000이기 때문에 dp로 푸는 문제였다.
점화식은 다음과 같다.
dp[i] = Math.max(dp[i - 1], dp[i - 2] + sticker[i]);
바로 이전 스티커를 떼었으면 현재 칸을 뗄 수 없고, 현재칸을 떼려면 i-2 칸의 점수에서 더해줘야한다.
다만, 생각해야할 점은 스티커가 원형으로 붙어있기 때문에 첫번째 스티커가 마지막 스티커에 영향을 준다는 것이다.
따라서, 이차원 배열을 만들어 첫번째 스티커를 떼는 경우를 dp[i][1]에 넣고, 떼지 않는 경우를 dp[i][0]에 넣어 진행했다.
메모리: 57.9MB
시간: 13.64ms
언어: Java 11
코드
class Solution {
public int solution(int sticker[]) {
int len = sticker.length;
if(len == 1) {
return sticker[0];
}
int[][] dp = new int[len][2];
dp[0][1] = sticker[0];
dp[1][1] = dp[0][1];
dp[1][0] = sticker[1];
for(int i = 2; i < len; i++) {
dp[i][0] = Math.max(dp[i - 2][0] + sticker[i], dp[i - 1][0]);
dp[i][1] = Math.max(dp[i - 2][1] + sticker[i], dp[i - 1][1]);
}
return Math.max(dp[len - 1][0], dp[len - 2][1]);
}
}