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]을 아래와 같이 구할 수 있습니다.
5
7
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]를 비교해서 큰 것을 선택해야 함을 알 수 있습니다.
10
12
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
+ */
12
25
public int rob (int [] nums ) {
13
26
int [][] dp = new int [nums .length ][2 ];
14
27
@@ -20,4 +33,30 @@ public int rob(int[] nums) {
20
33
21
34
return Math .max (dp [nums .length - 1 ][0 ], dp [nums .length - 1 ][1 ]);
22
35
}
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
+ }
23
62
}
0 commit comments