Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

전공공부

[BOJ_1068] 트리 본문

Study/Problem Solving

[BOJ_1068] 트리

monitor 2023. 12. 16. 20:43

설명


이전에 같은 문제를 풀었던 이력이 있어서 풀었는데 거의 이전과 동일한 풀이법이 나와서 조금 놀랐다. 트리 형태를 갖추고 해당 노드를 제외하고 리프노드의 갯수를 찾기 위한 로직인데 root가 지워지면 리프노드의 갯수를 셀 수 있는 트리의 형태가 되지 않고 이를 제외한 나머지 경우에서는 깊이 우선 탐색 법으로 탐색을 하면서 찾아서 리프 노드의 갯수를 세는 형식으로 풀었다.

 

코드


package tree;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class BOJ_1068 {
    static boolean visited[];
    static int root;
    public static void main(String[] args) throws Exception{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tk = new StringTokenizer(in.readLine()," ");

        int N = Integer.parseInt(tk.nextToken());

        List<Integer>[] nodeList = new ArrayList[N];

        tk = new StringTokenizer(in.readLine()," ");

        for (int i = 0; i < N; i++){
            nodeList[i] = new ArrayList<>();
        }
        visited = new boolean[N];
        root = -1;

        for (int i = 0; i < N; i++){
            int parents = Integer.parseInt(tk.nextToken());
            if (parents == -1){
                root = i;
            }else {
                nodeList[parents].add(i);
            }
        }

        tk = new StringTokenizer(in.readLine()," ");
        int where = Integer.parseInt(tk.nextToken());
        if(where == root){
            System.out.println(0);
        }else {
            visited[where] = true;
            System.out.println(dfs(root, nodeList));
        }
    }

    private static int dfs(int where, List<Integer>[] nodeList) {
        int cnt = 0;
        visited[where] = true;
        for (int i : nodeList[where]){
            if(!visited[i]) {
                visited[i] = true;
                cnt += dfs(i, nodeList);
            }
        }
        if(cnt != 0){
            return cnt;
        }else {
            return 1;
        }
    }
}
 

1068번: 트리

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

www.acmicpc.net

 

'Study > Problem Solving' 카테고리의 다른 글

[BOJ_20924] 트리의 기둥과 가지  (0) 2023.12.19
[BOJ_5639] 이진 검색 트리  (0) 2023.12.17
[BOJ_14675] 단절점과 단절선  (0) 2023.12.16
[BOJ_11725] 트리의 부모 찾기  (1) 2023.12.11
[자료구조] 트리  (0) 2023.12.10