|
| 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