Skip to content

Commit 075b059

Browse files
committed
rivkode house robber
1 parent 0fc7ec8 commit 075b059

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

house-robber/rivkode.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
1. 문제 이해
3+
집털기 문제는 작은 문제가 큰 문제를 해결할 수 있는 지점이 있다. 피보나치를 생각해보자.
4+
5+
이 포인트는 문제를 다시 생각해보면
6+
7+
1번째를 턴다고 선택했을 경우 2번째 뒤인 3번째부터 마지막까지 털었을때의 최대값과 더하게 되면 그게 정답이 된다.
8+
만약 2번째부터 턴다고 선택하면 4번째부터 마지막까지 털었을때의 최대값을 더하게 되면 그게 정답이 된다.
9+
그래서 점화식을 아래와 같이 구할 수 있다.
10+
11+
result = MAX(nums[start], + dfs(start + 2), dfs(start + 1))
12+
13+
이 말의 의미는 start가 어디던
14+
그 지점의 값과 2번째 뒤부터 마지막까지 털었을때의 최대값
15+
vs
16+
그 지점의 1번째 뒤부터 마지막까지 털었을때의 최대값
17+
중 더 큰 값이 정답이 된다는 의미이다.
18+
19+
그래서 이 점화식을 잘 세워야 하고 종료지점을 잘 설정해야한다.
20+
21+
종료시점은 여기서 더이상 털 집이 없을 경우이므로 nums의 길이를 초과한 인덱스가 들어왔을때가 종료지점이 된다.
22+
23+
24+
2. 예외 상황
25+
없음 -> 틀림 저렇게만 푸니 Time Limit Exceeded 발생
26+
여기서 메모이제이션을 이용해야함
27+
피보나치풀때도 메모이제이션을 이용해서 이전의 결과값을 저장하고 그걸 그대로 사용했었음
28+
이 문제도 동일하게 이전 결과값을 그대로 사용하면 다시 똑같은 내용을 계산하지 않고 사용할 수 있음
29+
30+
모든 값이 0일 수 있음 그러면 memo에서 초기화 값인 0을 체킹해도 값 자체가 0이므로 계속 계산을 하게 됨
31+
32+
3. 알고리즘 선택
33+
다이나믹 프로그래밍
34+
35+
4. 구현
36+
*/
37+
38+
import java.util.*;
39+
40+
class Solution {
41+
static int[] memo;
42+
43+
public int rob(int[] nums) {
44+
memo = new int[nums.length];
45+
46+
// memo 체크시 집값이 0인 예외 케이스에 대비하여 -1로 세팅
47+
for (int i=0; i<nums.length; i++) {
48+
memo[i] = -1;
49+
}
50+
51+
return dfs(0, nums, memo);
52+
}
53+
54+
public int dfs(int start, int[] nums, int[] memo) {
55+
// start가 nums.length보다 크거나 같다는 것은 nums의 최대 크기를 넘었다는 의미로 종료
56+
if (start >= nums.length) {
57+
return 0;
58+
}
59+
60+
// -1 값으로 memo 체크
61+
if (memo[start] != -1) {
62+
return memo[start];
63+
}
64+
65+
// start 인덱스를 기준으로 start를 선택하는게 더 큰값인지 그 다음 인덱스를 선택하는게 큰 값인지를 비교
66+
// memo에 저장
67+
memo[start] = Math.max(nums[start] + dfs(start + 2, nums, memo), dfs(start + 1, nums, memo));
68+
69+
return memo[start];
70+
}
71+
}
72+

0 commit comments

Comments
 (0)