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