BOJ

백준 1068 - 트리

yanJuicy 2022. 3. 10. 07:21
반응형

문제

https://www.acmicpc.net/problem/1068

 

1068번: 트리

첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다

www.acmicpc.net

 

 

풀이

서브트리를 이용해 문제를 해결한다. 서브트리로 더 이상 나눌 수 없을 때 까지 나누면, 그 때 리프 노드가 된다. 리프 노드는 자식이 더 없으므로 dfs 탐색을 통해서 더 이상 탐색이 불가능 할 때 리프노드로 규정한다.

위 그림에서 3번 노드에서 더 이상 dfs 탐색을 못하므로 3번 노드는 리프 1개가 된다. 4번 노드도 마찬가지로 리프 1개가 된다. 3번과 4번의 부모인 1번 노드에서 이 값들을 더 해준다. 이렇게 1번이 루트인 서브 트리에 대해서 작은 문제를 해결하고, 2번이 루트인 서브 트리에 대해서도 이를 반복하여 큰 문제를 푼다.

 

 

코드

java

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    static int n, x, root;
    static int[] leaf;
    static ArrayList<ArrayList<Integer>> child;

    public static void main(String[] args) {
        input();
        solve();
    }

    private static void solve() {
        for (ArrayList<Integer> a : child) {
            if (a.contains(x))
                a.remove((Integer) x);
        }
        if (root != x)
            dfs(root);
        System.out.println(leaf[root]);
    }

    private static void dfs(int v) {
        if (child.get(v).isEmpty())
            leaf[v] = 1;
        for (int next : child.get(v)) {
            dfs(next);
            leaf[v] += leaf[next];
        }
    }

    private static void input() {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        leaf = new int[n];
        child = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            child.add(i, new ArrayList<>());
        }

        for (int i = 0; i < n; i++) {
            int v = sc.nextInt();
            if (v == -1) {
                root = i;
                continue;
            }
            child.get(v).add(i);
        }
        x = sc.nextInt();
        sc.close();
    }
}
반응형

'BOJ' 카테고리의 다른 글

백준 2003 - 수들의 합 2  (0) 2022.03.17
백준 2110 - 공유기 설치  (0) 2022.03.11
백준 1759 - 암호 만들기  (0) 2022.03.02
백준 - 랜선 자르기  (0) 2022.02.28
백준 9095 - 1, 2, 3 더하기  (0) 2022.02.26