ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]1068: 트리 - JAVA
    문제풀이/백준 2021. 5. 10. 15:27

    [백준]1068: 트리

    www.acmicpc.net/problem/1068

     

    1068번: 트리

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

    www.acmicpc.net

    풀이

    부모 인덱스를 입력받고, 노드를 삭제한 후 리프 노드를 count하는 문제로 깊이 우선 탐색 방법을 적용하여 문제를 풀었다. (약간 변형된 DFS문제라고 생각한다.) 

     

    노드를 삭제할 때에는 재귀 함수를 활용하여 현재 노드의 부모 인덱스가 삭제된 노드라면 연쇄적으로 삭제가 일어나도록 구현해 주었다.

     

    리프노드를 카운트 할 때에는 깊이 우선 탐색을 활용하여 현재 노드를 부모로 가지는 노드가 하나라도 존재한다면 자식 노드를 연쇄적으로 탐색하도록 하였다. 재귀 함수 속에서 자식 노드가 하나라도 존재하는지를 기록해 주기 위해 boolean 타입의 변수를 하나 생성해 주었다. 자식 노드가 없다면 리프노드의 카운트를 증가시켰다.

     

    재미있는 문제였다!

     

    코드

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    import java.util.*;
     
    public class Main {
     
        static int n, delete;
        static int[] parent;
        static int count;
        static boolean[] visited;
        
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            
            n = scan.nextInt();
            parent = new int[n];
            int root = 0;
            for(int i = 0; i < n; i++) {
                parent[i] = scan.nextInt();        
                if(parent[i] == -1) root = i;
            }
            delete = scan.nextInt();
            
            deleteNode(delete);
                
            count = 0;
            visited = new boolean[n];
            countLeaf(root);
                
            System.out.println(count);
        }
        
        public static void deleteNode(int d) {
            parent[d] = -2//삭제된 노드 -2로 표시
            for(int i = 0; i < n; i++) {
                if(parent[i] == d) {
                    deleteNode(i);
                }
            }
        }
        
        public static void countLeaf(int s) {
            boolean isLeaf = true;
            visited[s] = true;
            if(parent[s] != -2) {
                for(int i = 0; i < n; i++) {
                    if(parent[i] == s && visited[i] == false) {
                        countLeaf(i);
                        isLeaf = false;
                    }
                }
                if(isLeaf) count++;
            }
        }
    }
    cs

    '문제풀이 > 백준' 카테고리의 다른 글

    [백준]1300: K번째 수 - JAVA  (0) 2021.05.13
    [백준]16236: 아기 상어 - JAVA  (0) 2021.05.11
    [백준]2636: 치즈 - JAVA  (0) 2021.05.07
    [백준]1806: 부분합 - JAVA  (0) 2021.05.05
    [백준]11559: Puyo Puyo - JAVA  (0) 2021.05.03

    댓글

Designed by Tistory.