2385. Amount of Time for Binary Tree to Be Infected

  • 트리의 νŠΉμ • μ§€μ μ—μ„œ 감염이 μ‹œμž‘λ˜μ–΄ 트리 μ „μ²΄λ‘œ νΌμ Έλ‚˜κ°€λŠ” μ‹œκ°„μ„ κ΅¬ν•œλ‹€.
    • μ‹œμž‘ μ‹œμ  0 에 ν•΄λ‹Ή 지점이 이미 κ°μ—Όλœ μƒνƒœμ΄λ‹€.
    • λ§€ μ‹œκ°„ 1 λ§ˆλ‹€ μΈμ ‘ν•œ λ…Έλ“œκ°€ κ°μ—Όλœλ‹€.
  • 문제λ₯Ό ν•œλ§ˆλ””λ‘œ μš”μ•½ν•˜λ©΄ 트리의 νŠΉμ • 지점을 root둜 ν•˜μ—¬ leaf λ…Έλ“œλ‘œ λ„λ‹¬ν•˜λŠ” μ΅œλŒ€ 깊이λ₯Ό κ΅¬ν•˜λŠ” 것이닀.
  • 트리의 νŠΉμ • 지점을 root둜 λ°”κΎΈμ–΄μ•Ό ν•˜κΈ°μ— 트리λ₯Ό κ·Έλž˜ν”„λ‘œ λ³€ν™˜ (λ˜λŠ” 트리λ₯Ό μž¬κ΅¬μ„±)ν•˜μ—¬ ν’€μ–΄μ•Ό ν•œλ‹€.
    • μ΄λ ‡κ²Œ ν•˜λ €λ©΄ μΆ”κ°€μ μœΌλ‘œ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜λ‹€.
  • ν•˜μ§€λ§Œ μƒνƒœκ°’μ„ μ΄μš©ν•˜μ—¬ ν‘ΈλŠ” 방법도 μžˆλ‹€.
    • ν˜„μž¬ λ…Έλ“œλ₯Ό ν¬ν•¨ν•˜μ—¬ 경둜의 μ΅œλŒ€ 길이λ₯Ό κ΅¬ν•œλ’€ λ§ˆμ§€λ§‰μ— -1을 ν•˜μ—¬ κ²°κ³Όλ₯Ό λ„μΆœν•΄λ‚Έλ‹€.
      • μ‹œμž‘μ μ€ 이미 감염 λ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ‹œκ°„μ—μ„œ 1을 λΉΌμ•Ό ν•œλ‹€.
    • 트리λ₯Ό μˆœνšŒν•  λ•Œ λ§€ λ‹¨κ³„λ§ˆλ‹€ 두 값을 λ„μΆœν•΄λ‚Έλ‹€.
      • κ°’1: ν˜„μž¬ νŠΈλ¦¬μ—μ„œ ꡬ할 수 μžˆλŠ” μ΅œλŒ€ 경둜의 길이
      • κ°’2: 감염 μ‹œμž‘μ μ—μ„œ ν˜„μž¬ μ§€μ κΉŒμ§€μ˜ 거리 (감염 μ‹œμž‘μ μ„ ν¬ν•¨ν•˜λ©°, 감염이 μ—†μœΌλ©΄ 0이 λœλ‹€)
    • μˆœνšŒλŠ” λ‹€μŒκ³Ό 같이 이루어진닀.
      • μ™Όμͺ½, 였λ₯Έμͺ½ 각각을 μˆœνšŒν•˜μ—¬ κ²°κ³Όκ°’ left, right 을 λ„μΆœν•΄λ‚Έλ‹€.
      • μ–‘μͺ½ λͺ¨λ‘ 감염이 μ—†λ‹€λ©΄
        • κ°’1: μ–‘μͺ½ 트리 쀑 μ΅œλŒ€ 깊이 κ°’ max(left.getKey(), right.getKey()) 을 κ΅¬ν•œλ’€ 1을 λ”ν•œλ‹€
        • κ°’2: ν˜„μž¬ λ…Έλ“œκ°€ 감염 μ‹œμž‘μ μ΄λΌλ©΄ 1, μ•„λ‹ˆλΌλ©΄ 0을 λŒλ €μ€€λ‹€
      • μ™Όμͺ½, 였λ₯Έμͺ½ 쀑 μ–΄λŠ ν•œμͺ½μ΄ κ°μ—Όλ˜μ—ˆλ‹€λ©΄
        • κ°μ—Όλœ μͺ½μ„ A, κ°μ—Όλ˜μ§€ μ•Šμ€ μͺ½μ€ B라고 ν•  λ•Œ
        • κ°’1
          • A μͺ½μ˜ κΉŠμ΄λŠ” κ²°κ³Όκ°’ A.getKey() κ·ΈλŒ€λ‘œκ°€ λœλ‹€.
          • 반면 B μͺ½μ€ 감염 μ‹œμž‘μ  ~ ν˜„μž¬ λ…Έλ“œκΉŒμ§€μ˜ 거리 + B μͺ½μ˜ 트리 κΉŠμ΄κ°€ 감염 거리가 λ˜λ―€λ‘œ μ΅œμ’… 깊이 값은 (B.getKey() + 1) + A.getValue() κ°€ λœλ‹€.
          • 두 κ°’ 쀑에 큰 값을 결과둜 ν•œλ‹€.
        • κ°’2
          • A μͺ½μ˜ 감염 거리에 1을 λ”ν•œλ‹€ (이제 ν˜„μž¬ νŠΈλ¦¬κ°€ κ°μ—Όλœ νŠΈλ¦¬κ°€ λœλ‹€).
/** * 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 { static final Pair<Integer, Integer> ZERO = new Pair<Integer, Integer>(0, 0); Pair<Integer, Integer> traverse(TreeNode node, int start) { Pair<Integer, Integer> left = node.left != null? traverse(node.left, start) : ZERO; Pair<Integer, Integer> right = node.right != null? traverse(node.right, start) : ZERO; if (left.getValue() == 0 && right.getValue() == 0) { int depth = Math.max(left.getKey(), right.getKey()) + 1; return new Pair(depth, node.val == start? 1 : 0); } else if (left.getValue() != 0) { return new Pair( Math.max(left.getKey(), right.getKey() + 1 + left.getValue()), left.getValue() + 1 ); } else { int x = Math.max(right.getKey() + 1, left.getKey() + right.getValue()); return new Pair( Math.max(right.getKey(), left.getKey() + 1 + right.getValue()), right.getValue() + 1 ); } } public int amountOfTime(TreeNode root, int start) { Pair<Integer, Integer> result = traverse(root, start); return result.getKey() - 1; } }