Algorithm/BOJ(Baekjoon Online Judge)

[백준 - 1068번] 트리 - Java //Wello Horld //

koucop 2020. 4. 2. 12:43

 

이번에는 BOJ의 1068번 문제 "트리" 를 풀어보도록 하자

 

 

성공한 코드는 다음과 같다.

 

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

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        ArrayList<Integer>[] listArr = (ArrayList<Integer>[]) new ArrayList[N];
        boolean[] chk = new boolean[N];
        int[] arr = new int[N];
        for (int i = 0; i < N; i++) {
            listArr[i] = new ArrayList<Integer>();
        }
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int root = 0;
        for (int i = 0; i < N; i++) {
            if (arr[i] == -1) {
                root = i;
                continue;
            }

            listArr[arr[i]].add(i);
            listArr[i].add(arr[i]);
        }

        int remove = Integer.parseInt(br.readLine());
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.add(remove);
        chk[remove] = true;
        while (!queue.isEmpty()) {
            remove = queue.poll();
            for (int a : listArr[remove]) {
                if (!chk[a] && arr[remove] != a) {
                    queue.add(a);
                    chk[a] = true;
                }
            }
        }

        int cnt = 0;
        if (!chk[root]) {
            queue.add(root);
            chk[root] = true;
            while (!queue.isEmpty()) {
                int node = queue.poll();
                boolean flag = false;
                for (int a : listArr[node]) {
                    if (!chk[a] && arr[node] != a) {
                        flag = true;
                        queue.add(a);
                        chk[a] = true;
                    }
                }
                if (!flag) {
                    cnt++;
                }
            }
        }
        bw.write(cnt + "\n");

        bw.flush();
        br.close();
        bw.close();
    }
}

 

 

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

 

1068번: 트리

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

www.acmicpc.net

 

혹시 코드에 이상한 부분이나 틀린 부분이 있던지, 이해가 안가는 부분이 있다면 댓글로 알려주세요