Algorithm/BFS & DFS

[๋ฐฑ์ค€, Java] 1068๋ฒˆ : ํŠธ๋ฆฌ

Zayson 2022. 5. 8. 15:54

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

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

๐Ÿ˜ฎ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Map์„ ์ด์šฉํ•ด ๊ตฌํ˜„์— ํ•„์š”ํ•œ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์ค€ ํ›„ DFS๋ฅผ ์ด์šฉํ•ด ๋ฃจํŠธ ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•œ๋‹ค.

  1. Map์—์„œ ํ˜„์žฌ ๋…ธ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ๋‹จ๋ง ๋…ธ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ๋ง ๋…ธ๋“œ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  2. ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œํ•  ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋“ค์€ ๋ชจ๋‘ ์‚ญ์ œ ๋˜๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ returnํ•œ๋‹ค.
  3. ๋งŒ์•ฝ ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ์—ฐ๊ฒฐ๋œ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๋…ธ๋“œ์ด๋ฉด์„œ ๋‹จ๋ง ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ๋Š” ์‚ญ์ œ ํ›„ ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ๋‹จ๋ง๋…ธ๋“œ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ๋ง ๋…ธ๋“œ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

๐Ÿšฉ Java ์ฝ”๋“œ

package com.algorithm.Baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main_1068_ํŠธ๋ฆฌ {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        Map<Integer, List<Integer>> tree = new HashMap<>();
        // ํŠธ๋ฆฌ ์ดˆ๊ธฐํ™”
        for (int node = 0; node < N; node++) {
            tree.put(node, new LinkedList<>());
        }

        StringTokenizer st = new StringTokenizer(br.readLine());
        int rootNode = 0;

        // ํŠธ๋ฆฌ ์—ฐ๊ฒฐ
        for (int node = 0; node < N; node++) {
            int parent = Integer.parseInt(st.nextToken());
            if (parent != -1) {
                tree.get(parent).add(node);
            } else {
                rootNode = node;
            }
        }

        // ์ œ๊ฑฐํ•  ๋…ธ๋“œ
        int removeNode = Integer.parseInt(br.readLine());
        leaf = 0;

        getLeafNode(rootNode, removeNode, tree);
        System.out.println(leaf);

        br.close();
    }

    private static int leaf;

    private static void getLeafNode(int start, int remove, Map<Integer, List<Integer>> tree) {
        // ์‚ญ์ œํ•  ๋…ธ๋“œ ๋„๋‹ฌ ์‹œ ์ดํ›„๋Š” DFS ์•ˆํ•จ
        if (start == remove) {
            return;
        }

        // ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋ฆฌํ”„๋…ธ๋“œ
        if (tree.get(start).size() < 1) {
            leaf++;
            return;
        }

      // ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ๋ฐ ์ž์‹ ๋…ธ๋“œ ๋ฐฉ๋ฌธ
        for (int next : tree.get(start)) {
			// ์—ฐ๊ฒฐ๋œ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œํ•  ๋…ธ๋“œ์ด๊ณ , ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ ํ•œ๊ฐœ์ธ ๊ฒฝ์šฐ -> ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋‹จ๋ง ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
            if(next == remove && tree.get(start).size() == 1) {
                leaf++;
            }
            getLeafNode(next, remove, tree);
        }
    }
}
๋ฐ˜์‘ํ˜•