알고리즘/트리

[BOJ 1068] 트리 (Java, DFS)

leejinwoo1126 2023. 6. 26. 21:00
반응형

 


문제 링크 

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

 

1068번: 트리

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

www.acmicpc.net


문제 풀이

- 인접 리스트로 트리 정의

- 제거할 노드(REMOVE_NODE)를 인접 리스트 순회하면서 제거

- LEAF 노드 배열 값을 갱신하며 DFS 탐색

- 최종적으로 ROOT 노드의 있는 값을 출력하면 됨

- 시간 복잡도 : O(N) , (N <= 50)


제출 코드

import java.io.*;
import java.util.*;

public class Main {

    static int N, REMOVE_NODE, ROOT;

    static List<Integer>[] adj;

    static int[] LEAF;

    static void input() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        LEAF = new int[N];

        adj = new ArrayList[N];
        for(int i = 0; i < N; i++) adj[i] = new ArrayList<>();

        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < N; i++) {
            int parent = Integer.parseInt(st.nextToken());
            if(parent == -1) {
                ROOT = i;
                continue;
            }

            adj[parent].add(i);
        }

        REMOVE_NODE = Integer.parseInt(br.readLine());
    }

    static void dfs(int node) {
        if(adj[node].isEmpty()) {
            LEAF[node] = 1;
            return;
        }

        for(int child : adj[node]) {
            dfs(child);
            LEAF[node] += LEAF[child];
        }
    }

    static void pro() {
        for(int i = 0; i < N; i++) {
            if(adj[i].contains(REMOVE_NODE)) {
                adj[i].remove(adj[i].indexOf(REMOVE_NODE));
            }
        }

        if(ROOT != REMOVE_NODE) dfs(ROOT);

        System.out.println(LEAF[ROOT]);
    }

    public static void main(String[] args) throws Exception {
        input();
        pro();
    }
}
반응형