Skip to content

Commit e4d71ba

Browse files
committed
House Robber - 공간 복잡도 개선 및 해설 추가
1 parent 19d1243 commit e4d71ba

File tree

1 file changed

+48
-9
lines changed

1 file changed

+48
-9
lines changed

house-robber/forest000014.java

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,27 @@
1-
/*
2-
Runtime: 0 ms(Beats: 100.00 %)
3-
Time Complexity: O(nlogn)
4-
- nums iteration : O(n)
1+
class Solution {
2+
/*
3+
[1, i]의 범위에서 최대값을 구하고자 할 때, 만약 [1, i-1]의 범위에서의 최대값을 이미 계산해 놓았다면 O(1)에 계산할 수 있다는 아이디어에서 출발합니다.
4+
단, 연속해서 두 집에서 훔칠 수 없다는 전제조건이 있으므로, i-1번째 집에서 훔친 경우와 훔치지 않는 경우 각각에 대한 최대값을 따로 구해두어야 합니다.
5+
dp[i-1][0]에는 i-1번째 집에서 훔치지 않는 경우의 최대값, dp[i-1][1]에는 i-1번째 집에서 훔친 경우의 최대값이 저장되어 있다는 전제하에,
6+
dp[i][0], dp[i][1]을 아래와 같이 구할 수 있습니다.
57
6-
Memory: 41.40 MB(Beats: 43.05 %)
7-
Space Complexity: O(n)
8-
- dp[n][2] : O(n) * 2 = O(n)
9-
*/
8+
1) i번째 집에서 훔치지 않는 경우의 [1, i] 범위에서의 최대값
9+
i번째 집에서는 훔치지 않을 것이므로, [1, i-1] 범위에서의 최대값이 dp[i][0]이 됩니다.
10+
단, 여기서 주의할 점은 dp[i-1][1]이 무조건 dp[i-1][0] 이상이라고 착각할 수 있다는 건데요,
11+
{100, 1, 1, 100} 에서 dp[1][0] = 100, dp[1][1] = 1 이라는 케이스를 생각해보면, dp[i-1][0], dp[i-1][1]를 비교해서 큰 것을 선택해야 함을 알 수 있습니다.
1012
11-
class Solution {
13+
2) i번째 집에서 훔치는 경우의 [1, i] 범위에서의 최대값
14+
i번째 집에서 훔치기 위해서는, i-1번째 집에서는 훔치지 않았어야만 합니다.
15+
따라서 단순히 dp[i][1] = dp[i-1][0] + nums[i] 가 됩니다.
16+
17+
Runtime: 0 ms(Beats: 100.00 %)
18+
Time Complexity: O(n)
19+
- nums iteration : O(n)
20+
21+
Memory: 41.04 MB(Beats: 43.05 %)
22+
Space Complexity: O(n)
23+
- dp[n][2] : O(n) * 2 = O(n)
24+
*/
1225
public int rob(int[] nums) {
1326
int[][] dp = new int[nums.length][2];
1427

@@ -20,4 +33,30 @@ public int rob(int[] nums) {
2033

2134
return Math.max(dp[nums.length - 1][0], dp[nums.length - 1][1]);
2235
}
36+
37+
/*
38+
생각해보니 memoization 배열을 굳이 들고다닐 필요가 없어서,
39+
필요한 값(직전 인덱스에서의 memoization 값)만 저장하도록 수정해서 공간 복잡도를 개선했습니다.
40+
그런데... 무슨 이유에선지 오히려 메모리 사용량은 더 증가했다고 나오네요...?
41+
42+
Runtime: 0 ms(Beats: 100.00 %)
43+
Time Complexity: O(n)
44+
- nums iteration : O(n)
45+
46+
Memory: 41.21 MB(Beats: 22.01 %)
47+
Space Complexity: O(1)
48+
*/
49+
public int rob2(int[] nums) {
50+
int[] dp = new int[2];
51+
52+
dp[1] = nums[0];
53+
for (int i = 1; i < nums.length; i++) {
54+
int tmp0 = Math.max(dp[0], dp[1]);
55+
int tmp1 = dp[0] + nums[i];
56+
dp[0] = tmp0;
57+
dp[1] = tmp1;
58+
}
59+
60+
return Math.max(dp[0], dp[1]);
61+
}
2362
}

0 commit comments

Comments
 (0)