Leetcode Java Pseudo-Palindromic Paths in a Binary Tree
업데이트:
문제
코드
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int pseudoPalindromicPaths(TreeNode root) {
return this.dfs(root, 0);
}
private int dfs(TreeNode root, int count) {
if (root == null) {
return 0;
}
count ^= 1 << (root.val - 1);
int result = this.dfs(root.left, count) + this.dfs(root.right, count);
if (root.left == root.right && (count & (count - 1)) == 0) {
result++;
}
return result;
}
}
결과
설명
-
root의 루트 노드부터 리프 노드까지 값들을 이어준 값 중 최소 한 개 이상의 값을 재 배열하였을 때, 앞과 뒤가 동일한 문자열(이하 회문)이 되는 경우의 수를 구하는 문제이다.
-
3번에서 정의한 dfs(TreeNode root, int count) 메서드를 count에 0을 넣고 수행한 결과를 주어진 문제의 결과로 반환한다.
-
DFS 방식으로 회문이 되는 문자열을 검증하기 위한 dfs(TreeNode root, int count) 메서드를 정의한다.
- root가 null인 경우, 이어줄 값이 없으므로 0을 반환한다.
- count에 count와 1의 비트를 $root.val - 1$번 좌측으로 이동한 값의 XOR(^) 비트 연산을 수행한 결과를 넣어준다.
- result는 경우의 수를 계산하기 위한 변수로, root의 left와 right TreeNode를 순차적으로 count를 활용하여 재귀 호출한 결과를 더해서 넣어준다.
- root의 left와 right TreeNode가 null이면서 count와 $count - 1$을 AND(&) 비트 연산을 수행한 결과가 0인 경우, 회문을 만들 수 있으므로 result를 증가시킨다.
- 계산된 회문이 가능한 경우인 result를 반환한다.
해설
- TreeNode의 값은 [1, 9] 범위 내 값으로 이루어져 있으며, 회문이 되는 경우 XOR(^) 비트 연산을 수행하면 단 하나의 값만 남게 된다.
- 위의 조건을 기반으로 1을 좌측으로 8번 이동시켜도 $2^8 = 256$이 되므로, count에 자신의 값과 1을 $root.val - 1$번 좌측으로 이동시킨 값을 XOR(^) 연산을 root 노드부터 leaf 노드까지 모두 수행하였을 때 회문이 되는 경우는 단 하나의 1 비트만 존재하는 경우이다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기