우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»‍πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀

Eager To Learn 🌌

πŸ‘¨πŸ»‍πŸ’» PS/바킹독

[JAVA] λ°±μ€€ 2250번 【G2.트리의 높이와 λ„ˆλΉ„γ€‘

2023. 10. 4. 12:06

문제

 

2250번: 트리의 높이와 λ„ˆλΉ„

첫째 쀄에 λ…Έλ“œμ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ N(1 ≤ N ≤ 10,000)이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ N개의 μ€„μ—λŠ” 각 μ€„λ§ˆλ‹€ λ…Έλ“œ λ²ˆν˜Έμ™€ ν•΄λ‹Ή λ…Έλ“œμ˜ μ™Όμͺ½ μžμ‹ λ…Έλ“œμ™€ 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œμ˜ λ²ˆν˜Έκ°€ μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§„λ‹€.

www.acmicpc.net

 

풀이

1️⃣ μ€‘μœ„μˆœνšŒλ₯Ό μ΄μš©ν•œ 풀이

πŸ’‘ λ– μ˜€λ₯Έ Idea


μ€‘μœ„ μˆœνšŒλŠ” μœ„μ™€ 같이 트리의 λ…Έλ“œλ₯Ό μˆœνšŒν•˜λŠ” 방식이닀.

μ€‘μœ„ 순회λ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΈλ¦¬μ— μ‘΄μž¬ν•˜λŠ” 각 λ…Έλ“œμ˜ μ—΄ 값을 μ•Œ 수 μžˆλ‹€.

각 λ…Έλ“œμ˜ 깊이λ₯Ό μ²΄ν¬ν•΄λ‚˜κ°€λ©΄μ„œ μ€‘μœ„ 순회λ₯Ό ν•˜κ³ , 각 κΉŠμ΄μ— ν•΄λ‹Ήν•˜λŠ” μ—΄ κ°’μ˜ μ΅œμ†Ÿκ°’κ³Ό μ΅œλŒ“κ°’μ„ 기둝해두면 λœλ‹€.

 

public class Main {
    static Node[] tree;
    static Map<Integer, int[]> info = new HashMap<>();
    static int col = 1;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        tree = new Node[N + 1];
        boolean[] isChild = new boolean[N + 1];

        for (int i = 0; i <= N; i++) {
            tree[i] = new Node(i);
        }

        for (int i = 1; i <= N; i++) {
            String[] input = br.readLine().split(" ");
            int parentNode = Integer.parseInt(input[0]);
            int leftNode = Integer.parseInt(input[1]);
            int rightNode = Integer.parseInt(input[2]);

            if (leftNode != -1) {
                tree[parentNode].leftNode = tree[leftNode];
                isChild[leftNode] = true;
            }

            if (rightNode != -1) {
                tree[parentNode].rightNode = tree[rightNode];
                isChild[rightNode] = true;
            }

        }

        int root = findRoot(N, isChild);

        inOrder(tree[root], 1);

        PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]);

        for (Integer depth : info.keySet()) {
            int[] value = info.get(depth);
            int width = value[0] - value[1] + 1;
            pq.offer(new int[]{width, depth});
        }

        int[] poll = pq.poll();
        System.out.println(poll[1] + " " + poll[0]);

    }

    private static void inOrder(Node root, int depth) {
        if (root == null) {
            return;
        }

        inOrder(root.leftNode, depth + 1);
        setMaxAndMin(depth);
        col++;
        inOrder(root.rightNode, depth + 1);

    }

    private static void setMaxAndMin(int depth) {
        if (!info.containsKey(depth)) {
            info.put(depth, new int[]{col, col});
        } else {
            int[] maxAndMin = info.get(depth);
            maxAndMin[0] = Math.max(maxAndMin[0], col);
            maxAndMin[1] = Math.min(maxAndMin[1], col);
            info.put(depth, maxAndMin);
        }
    }

    private static int findRoot(int N, boolean[] isChild) {
        int rootNode = 1;
        for (int i = 1; i <= N; i++) {
            if (!isChild[i]) {
                rootNode = i;
                break;
            }
        }
        return rootNode;
    }

    static class Node {
        int value;
        Node leftNode;
        Node rightNode;

        public Node(int value) {
            this.value = value;
        }
    }
}

 

트리의 순회λ₯Ό ν•˜κΈ° 전에, 루트 λ…Έλ“œλ₯Ό μ°ΎλŠ” 방법은 

 

μž…λ ₯ μ‹œμ—, μžμ‹ λ…Έλ“œλ‘œμ„œ μž…λ ₯λ˜λŠ” λ…Έλ“œλ“€μ„ μ²΄ν¬ν•˜λ©΄ μ²΄ν¬λ˜μ§€ μ•Šμ€ μœ μΌν•œ λ…Έλ“œκ°€ 루트 λ…Έλ“œκ°€ 됨을 μ΄μš©ν•˜μ—¬ μ°Ύμ•„λ‚΄μ—ˆλ‹€.

 

그리고, λ„ˆλΉ„κ°€ κ°€μž₯ 넓은 레벨이 두 개 이상 μžˆμ„ λ•ŒλŠ” λ²ˆν˜Έκ°€ μž‘μ€ λ ˆλ²¨μ„ 좜λ ₯ν•΄μ•Όν•˜λ―€λ‘œ, μš°μ„ μˆœμœ„ 큐λ₯Ό μ‚¬μš©ν•˜μ˜€λ‹€.

 

κ²°κ³Ό

트리 문제λ₯Ό ν’€ λ•Œμ—λŠ”, 트리의 μ„±μ§ˆκ³Ό 순회의 νŠΉμ„±μ„ 잘 νŒŒμ•…ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€λŠ” 사싀을 λ‹€μ‹œ ν•œλ²ˆ κΉ¨λ‹«κ²Œ λ˜λŠ” λ¬Έμ œμ˜€λ‹€.

    'πŸ‘¨πŸ»‍πŸ’» PS/바킹독' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [JAVA] λ°±μ€€ 21276번 【G2.계보 볡원가 ν˜Έμ„γ€‘
    • [JAVA] λ°±μ€€ 1967번 【G4.트리의 지름】
    • [JAVA] λ°±μ€€ 20955번 【G4.λ―Όμ„œμ˜ 응급 μˆ˜μˆ γ€‘
    • [JAVA] λ°±μ€€ 22856번 【G4.트리 μˆœνšŒγ€‘
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”