Leetcode Java House Robber III
업데이트:
문제
코드
class Solution {
public int rob(TreeNode root) {
int[] result = this.recursive(root);
return Math.max(result[0], result[1]);
}
private int[] recursive(TreeNode root) {
int[] result = new int[2];
if (root == null) {
return result;
}
int[] left = this.recursive(root.left);
int[] right = this.recursive(root.right);
result[0] = root.val + left[1] + right[1];
result[1] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
return result;
}
}
결과
설명
- 주어진 TreeNode인 root의 최상위 노드부터 시작해서 도둑질할 수 있는 최대 금액을 구하는 문제이다.
- 단, 자식 노드가 두 개인 노드의 금액은 도둑질이 불가능하다.
- 재귀 호출을 사용하여 root를 순회할 recursive(TreeNode root) 메서드를 완성한다.
- 정수 배열인 result를 최대 자식 노드의 개수인 2의 크기로 초기화 하여 정의한다.
- root가 null인 경우 더 이상 탐색이 불가능하므로, result를 그대로 반환한다.
- root의 left TreeNode를 재귀 호출한 결과를 left에, right TreeNode를 재귀 호출한 결과를 right에 넣어준다.
- result에 재귀 호출로 구해진 left와 right를 이용하여 두 값을 넣어준다.
- 첫 번째 값에 $root.val + left[1] + right[1]$을 넣어준다.
- 두 번째 값에 left[0]과 left[1] 중 큰 값과 right[0]과 right[1] 중 큰 값의 합을 넣어준다.
- result를 반환한다.
- root를 2번의 재귀 호출을 수행한 결과를 result에 넣어주고, result[0] 과 result[1] 중 큰 값을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기