1457.Β Pseudo-Palindromic Paths in a Binary Tree

  • Binary treeλ₯Ό rootλΆ€ν„° leaf κΉŒμ§€ νƒμƒ‰ν–ˆμ„ λ•Œμ˜ 경둜λ₯Ό 라고 ν•  λ•Œ 에 μ†ν•˜λŠ” λ…Έλ“œλ₯Ό μž„μ˜μ˜ μˆœμ„œλ‘œ λ‚˜μ—΄ν•˜μ—¬ 회문(palindrome)을 λ§Œλ“€ 수 μžˆλŠ” 경둜의 수λ₯Ό κ΅¬ν•˜λŠ” 문제.
  • κ²½λ‘œμ— μ†ν•œ λ…Έλ“œλ₯Ό 자유둭게 λ°°μΉ˜ν•  수 μžˆλ‹€λ©΄ νšŒλ¬Έμ„ λ§Œλ“€κΈ°μœ„ν•œ 쑰건은 μ•„λž˜μ™€ κ°™λ‹€.
    • κ²½λ‘œμ— μ†ν•œ 각 λ…Έλ“œμ˜ 숫자 별 μΆœν˜„ λΉˆλ„λ₯Ό μ„Έμ—ˆμ„ λ•Œ μΆœν˜„ λΉˆλ„κ°€ ν™€μˆ˜μΈ 숫자의 μ’…λ₯˜κ°€ 1개 μ΄ν•˜μ—¬μ•Ό ν•œλ‹€.
    • μ‰½κ²Œ μƒκ°ν•˜λ©΄ λͺ¨λ“  μˆ«μžκ°€ 짝수 횟수만큼 μΆœν˜„ν–ˆλ‹€λ©΄ λ¬Έμžμ—΄μ„ 반으둜 λ‚˜λˆ„μ–΄ μ–‘μͺ½μ— λŒ€μΉ­μœΌλ‘œ λ°°μΉ˜ν•  수 μžˆμ„ 것이닀 (예: bbaaaabb).
    • 만일 νŠΉμ • 숫자만 ν™€μˆ˜ 횟수 μΆœν˜„ν–ˆλ‹€λ©΄ ν•΄λ‹Ή 문자λ₯Ό ν•œκ°œλ§Œ κ°€μš΄λ°μ— λ°°μΉ˜ν•˜κ³  λ‚˜λ¨Έμ§€λŠ” μ–‘μͺ½μ— λŒ€μΉ­μœΌλ‘œ λ°°μΉ˜ν•˜λ©΄ λœλ‹€ (예: bbaaabb).
    • ν•˜μ§€λ§Œ ν™€μˆ˜ 횟수 μΆœν˜„ν•œ 숫자의 μ’…λ₯˜κ°€ 2개 이상이라면 μœ„μ™€ 같이 λŒ€μΉ­μœΌλ‘œ λ°°μΉ˜ν•  수 μžˆλŠ” 방법이 μ—†μœΌλ―€λ‘œ νšŒλ¬Έμ„ λ§Œλ“€ 수 μ—†λ‹€.
  • κ²°κ΅­ κ²½λ‘œλ§ˆλ‹€ 각 μˆ«μžλ³„λ‘œ μΆœν˜„ λΉˆλ„λ₯Ό ν™•μΈν•˜κ³  ν™€μˆ˜λ²ˆ μΆœν˜„ν•œ 숫자의 μˆ˜κ°€ 1개 μ΄ν•˜μΈμ§€ ν™•μΈν•˜λ©΄ λœλ‹€.
    • λ…Έλ“œμ˜ μˆ«μžλŠ” 1 ~ 9κ°€ 올 수 있고 μΆœν˜„λΉˆλ„κ°€ ν™€μˆ˜, 짝수 μΈμ§€λ§Œ ν™•μΈν•˜λ©΄ λœλ‹€.
    • Integer의 1 ~ 9번째 bitλ₯Ό 각 μˆ«μžμ— λŒ€μ‘μ‹œμΌœ μˆ«μžκ°€ μΆœν˜„ν•  λ•Œ λ§ˆλ‹€ bitλ₯Ό toggleν•œλ‹€.
    • μ΅œμ’…μ μœΌλ‘œ 1둜 μ„€μ •λœ bit의 수λ₯Ό μ„Έλ©΄ ν™€μˆ˜λ²ˆ μΆœν˜„ν•œ 숫자의 개수λ₯Ό μ…€ 수 μžˆλ‹€.
class Solution { int traverse(TreeNode node, int state) { state ^= 1 << node.val; boolean isLeaf = node.left == null && node.right == null; if (isLeaf) { return Integer.bitCount(state) <= 1? 1 : 0; } int result = 0; if (node.left != null) result += traverse(node.left, state); if (node.right != null) result += traverse(node.right, state); return result; } public int pseudoPalindromicPaths (TreeNode root) { return traverse(root, 0); } }