Algorithm & Data Structures/BOJ

b1068. ํŠธ๋ฆฌ

Geisha 2025. 5. 31. 21:00

 

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

 

 

 

๐ŸŒฒ ์ž๋ฐ”๋กœ ํ‘ธ๋Š” ํŠธ๋ฆฌ ๋ฌธ์ œ ํ’€์ด (๋ฐฑ์ค€ 1068 - ํŠธ๋ฆฌ)

 


 

๐Ÿ“Œ ๋ฌธ์ œ ๊ฐœ์š”

 

  • N๊ฐœ์˜ ๋…ธ๋“œ๋กœ ์ด๋ฃจ์–ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง
  • ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ–ˆ์„ ๋•Œ, ๋‚จ์€ ํŠธ๋ฆฌ์˜ ๋ฆฌํ”„ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

 

 

์ œ์•ฝ ์กฐ๊ฑด

 

  • ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋Š” 0๋ฒˆ๋ถ€ํ„ฐ N-1๋ฒˆ๊นŒ์ง€
  • ๋ฃจํŠธ๋Š” ๋ถ€๋ชจ๊ฐ€ -1์ธ ๋…ธ๋“œ
  • ์‚ญ์ œ ์‹œ ํ•ด๋‹น ๋…ธ๋“œ์™€ ๊ทธ ํ•˜์œ„ ๋…ธ๋“œ ์ „๋ถ€ ์ œ๊ฑฐ

 


 

๐Ÿ’ก ์˜ˆ์ œ ์ž…๋ ฅ

5
-1 0 0 1 1
2

→ ๋…ธ๋“œ 2๋ฒˆ์„ ์ง€์šฐ๋ฉด, ๋‚จ์€ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

        0
       / \
      1   (X)
     / \
    3   4

→ ๋ฆฌํ”„ ๋…ธ๋“œ๋Š” 3, 4 → 2๊ฐœ

 

 

์˜ˆ์ œ ์ถœ๋ ฅ

2

 


 

๐Ÿง  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ‘๊ทผ ๋ฐฉ์‹

 

  1. ์ž…๋ ฅ ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋ฆฌ ๊ตฌ์กฐ ์ƒ์„ฑ
    • tree[i] = [์ž์‹1, ์ž์‹2, ...]
  2.  
  3. ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ๋ฉด → ๋ฆฌํ”„ ๋…ธ๋“œ 0๊ฐœ
  4. ๋ฃจํŠธ๋ถ€ํ„ฐ DFS ์ˆ˜ํ–‰
    • ์ž์‹์ด ์—†๊ฑฐ๋‚˜ ์‚ญ์ œ๋œ ์ž์‹๋งŒ ์žˆ์œผ๋ฉด ๋ฆฌํ”„ ๋…ธ๋“œ๋กœ ๊ฐ„์ฃผ
  5.  

 


 

๐Ÿ” ์ „์ฒด ์ฝ”๋“œ (DFS ๊ธฐ๋ฐ˜)

import java.util.*;

public class Main {
    static List<Integer>[] tree;
    static int deleteNode, leafCount = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] parent = new int[N];
        tree = new ArrayList[N];
        int root = -1;

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

        for (int i = 0; i < N; i++) {
            parent[i] = sc.nextInt();
            if (parent[i] == -1) root = i;
            else tree[parent[i]].add(i);
        }

        deleteNode = sc.nextInt();

        if (deleteNode == root) System.out.println(0);
        else {
            dfs(root);
            System.out.println(leafCount);
        }
    }

    static void dfs(int now) {
        if (now == deleteNode) return;

        int childCount = 0;
        for (int child : tree[now]) {
            if (child != deleteNode) {
                dfs(child);
                childCount++;
            }
        }

        if (childCount == 0) leafCount++;
    }
}

 


 

๐Ÿ” ์ฝ”๋“œ ํ•ด์„ค

๊ตฌ๋ฌธ ์„ค๋ช…
tree[parent[i]].add(i) ํŠธ๋ฆฌ๋ฅผ ์ž์‹ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ์„ฑ
if (deleteNode == root) ๋ฃจํŠธ๊ฐ€ ์ง€์›Œ์ง€๋ฉด ํŠธ๋ฆฌ ์ž์ฒด๊ฐ€ ์‚ฌ๋ผ์ง
dfs(now) ์‚ญ์ œ ๋…ธ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด ๋ฐ”๋กœ ๋ฆฌํ„ด
if (childCount == 0) ๋” ์ด์ƒ ๊ฐˆ ์ž์‹์ด ์—†๋‹ค๋ฉด ๋ฆฌํ”„ ๋…ธ๋“œ

 


 

โœ… ํ•ต์‹ฌ ํฌ์ธํŠธ ์ •๋ฆฌ

 

  • ํŠธ๋ฆฌ๋Š” ์—ฐ๊ฒฐ ์ •๋ณด๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š์Œ → ๋ถ€๋ชจ ๋ฐฐ์—ด ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์‹ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
  • ์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ์ผ ๊ฒฝ์šฐ ์ฃผ์˜!
  • DFS ์ค‘ ์‚ญ์ œ ๋Œ€์ƒ ๋…ธ๋“œ๋Š” ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์Œ