원형 구조라 첫 번째 집과 마지막 집을 동시에 선택할 수 없는 제약을 두 번의 DP 로 해결했다.
경우 1: 첫 번째 집 포함 (마지막 집 제외)
→ dp1을 money[0] ~ money[n-2] 범위로 실행
경우 2: 마지막 집 포함 (첫 번째 집 제외)
→ dp2를 money[1] ~ money[n-1] 범위로 실행
정답 = max(dp1[n-2], dp2[n-1])
dp[i] = max(dp[i-2] + money[i], dp[i-1])
→ 현재 집을 털거나(dp[i-2] + money[i]) 안 털거나(dp[i-1])
dp2[0] = 0 으로 시작 = 첫 번째 집을 아예 고려하지 않음import java.util.*;
class Solution {
public int solution(int[] money) {
int n = money.length;
// 경우 1: 첫 번째 집 포함, 마지막 집 제외
int[] dp1 = new int[n];
dp1[0] = money[0];
dp1[1] = dp1[0];
for (int i = 2; i < n-1; i++) {
dp1[i] = Math.max(dp1[i-2] + money[i], dp1[i-1]);
}
// 경우 2: 마지막 집 포함, 첫 번째 집 제외
int[] dp2 = new int[n];
dp2[1] = money[1];
for (int i = 2; i < n; i++) {
dp2[i] = Math.max(dp2[i-2] + money[i], dp2[i-1]);
}
return Math.max(dp1[n-2], dp2[n-1]);
}
}
dp2[0] = 0 으로 시작하면 자연스럽게 첫 번째 집을 제외할 수 있다.