Algorithm & Data Structures/Programers
Lv 4. 도둑질
Geisha
2025. 1. 20. 13:14

https://school.programmers.co.kr/learn/courses/30/lessons/42897
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

이전에 한번 풀어본 유형의 DP 유형이었기에 쉽게
풀이할 수 있었다. 첫집과 끝집은 연결되어 있기 때문에
dp 배열을 2가지 종류로 나누어야했는데,
dp1은 첫집을 포함하는 경우로서 마지막 집의 포함경우를 제외하였고
dp2는 첫집을 포함하는 경우를 제외하는경우로서 마지막집의 돈을 포함한 결과이다.
결국 dp[0]은 0으로 설정해 주고 Math.max 함수를 통해
dp[i] = Math.max(dp[i-1],dp[i-2]+dp[i]) 라는 점화식을 세워
풀이할 수 있었다.
LV 4. 치곤 풀만한 문제였다.
import java.util.*;
class Solution {
int[] dp1,dp2;
public int solution(int[] money) {
int size = money.length;
dp1 = new int[size+1];
dp2 = new int[size+1];
dp1[0] = 0;
dp2[0] = 0;
for(int i = 0 ; i < size-1 ; i++){
dp1[i+1] = money[i];
dp2[i+1] = money[i+1];
}
for(int i = 2 ; i < dp1.length ; i++){
dp1[i] = Math.max(dp1[i-1],dp1[i-2]+dp1[i]);
dp2[i] = Math.max(dp2[i-1],dp2[i-2]+dp2[i]);
}
return Math.max(dp1[size-1],dp2[size-1]);
}
}