이번에 풀어본 문제는
프로그래머스 스티커 모으기(2) 입니다.
class Solution {
public int solution(int sticker[]) {
int answer = 0;
int len = sticker.length;
if (len == 1) return sticker[0];
int [] dp = new int[len];
// 첫 번째 스티커를 뗐을때
dp[0] = sticker[0];
dp[1] = dp[0];
for (int i = 2; i < len - 1; i++) {
dp[i] = Math.max(dp[i - 2] + sticker[i], dp[i - 1]);
}
answer = dp[len - 2];
// 첫 번째 스티커를 안뗐을때
dp[0] = 0;
dp[1] = sticker[1];
for (int i = 2; i < len; i++) {
dp[i] = Math.max(dp[i - 2] + sticker[i], dp[i - 1]);
}
answer = Math.max(answer, dp[len - 1]);
return answer;
}
}
문제에 주어진 조건에 맞게 스티커를 떼서, 최댓값을 출력하는 문제입니다.
dp 배열의 각 인덱스는 해당 위치까지의 최댓값을 의미하며, idx-2까지의 최댓값에서 현재 위치의 스티커를 더한 값과, 현재 위치를 뽑지 않는 idx-1 값 중 큰 값을 선택하여 dp배열을 완성하면 됩니다.
인덱스 범위 때문에 처음과 마지막 인덱스를 비교하기 힘들어서, 첫 번째 스티커를 뽑았을 경우와 뽑지 않았을 경우 두 가지로 나누어 dp 배열을 완성시키고, 마지막에 비교하여 출력했습니다.
쉬워보였는데, 첫 번째와 마지막 인덱스를 어떻게 풀어내야 할지 감이 오지 않아서 너무 어렵게 풀었습니다 ㅠ