[Boj_19542] ์ „๋‹จ์ง€ ๋Œ๋ฆฌ๊ธฐ

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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

 

โ–ธ ๋ฌธ์ œ

ํ˜„๋ฏผ์ด๋Š” ํŠธ๋ฆฌ ๋ชจ์–‘์˜ ๊ธธ ์œ„์—์„œ ์˜คํ† ๋ฐ”์ด๋ฅผ ํƒ€๊ณ  ์ „๋‹จ์ง€๋ฅผ ๋Œ๋ฆฌ๋ ค๊ณ  ํ•œ๋‹ค. ํ˜„๋ฏผ์ด์˜ ๋ชฉํ‘œ๋Š” ์ผ€๋‹ˆ์†Œํ”„ํŠธ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ์ „๋‹จ์ง€๋ฅผ ๋Œ๋ฆฌ๊ณ , ๋‹ค์‹œ ์ผ€๋‹ˆ์†Œํ”„ํŠธ๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒƒ์ด๋‹ค. ํ˜„๋ฏผ์ด๋Š” ํž˜์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๊ฑฐ๋ฆฌ๊ฐ€ D ์ดํ•˜์ธ ๋ชจ๋“  ๋…ธ๋“œ์— ์ „๋‹จ์ง€๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๋‚ ์”จ๊ฐ€ ๋งค์šฐ ๋ฅ๊ธฐ ๋•Œ๋ฌธ์—, ํ˜„๋ฏผ์ด๋Š” ์ตœ์†Œํ•œ๋งŒ ์ด๋™ํ•ด์„œ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ณ  ์‹ถ๋‹ค! ํ˜„๋ฏผ์ด๋ฅผ ์œ„ํ•ด ํ˜„๋ฏผ์ด๊ฐ€ ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ์ด ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์ฃผ์ž.

 

โ–ธ ์ž…๋ ฅ

์ฒซ๋ฒˆ์งธ ์ค„์—๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ N(1≤N≤100 000)๊ณผ ์ผ€๋‹ˆ์†Œํ”„ํŠธ์˜ ์œ„์น˜ S(1≤S≤N), ํž˜ D(0≤D≤N)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N๋ฒˆ์งธ ์ค„๊นŒ์ง€, ํŠธ๋ฆฌ์˜ ๊ฐ„์„  ์ •๋ณด๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋‘ ์ž์—ฐ์ˆ˜ x, y๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” x๋ฒˆ ๋…ธ๋“œ์™€ y๋ฒˆ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค. (1≤x,y≤N, x≠y)

์ฃผ์–ด์ง€๋Š” ์—ฐ๊ฒฐ๊ด€๊ณ„๋Š” ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉฐ, ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ธธ์ด๋Š” 1์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

ํ˜„๋ฏผ์ด๊ฐ€ ๋ชฉํ‘œ๋ฅผ ์™„์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ๋ผ.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 3
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๊ทธ๋ž˜ํ”„ ์ด๋ก , ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰, ํŠธ๋ฆฌ, ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ๋งต์—์„œ ์ „๋‹จ์ง€๋ฅผ ๋ฐฐํฌํ•  ๋•Œ, ์ตœ์†Œํ•œ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๋ฌธ์ œ์—์„œ ํ˜„๋ฏผ์ด๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ D ์ดํ•˜์ธ ๋ชจ๋“  ๋…ธ๋“œ์— ์ „๋‹จ์ง€๋ฅผ ์ง์ ‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.
์ฆ‰, ๋ฆฌํ”„ ๋…ธ๋“œ์—์„œ๋ถ€ํ„ฐ ๊ฑฐ๋ฆฌ๊ฐ€ D๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋…ธ๋“œ๋“ค๋งŒ ์ง์ ‘ ๋ฐฉ๋ฌธํ•˜๋ฉด ๋œ๋‹ค.

 

1๏ธโƒฃ DFS ํƒ์ƒ‰์„ ํ†ตํ•ด ๊ฐ ๋…ธ๋“œ์˜ ์ตœ๋Œ€ Depth๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

  • ๊ฐ ๋…ธ๋“œ์—์„œ ๊ฐ€์žฅ ๊นŠ์€ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ(Depth)๋ฅผ ๊ตฌํ•œ๋‹ค.
  • DFS๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ, ํ˜„์žฌ ๋…ธ๋“œ์˜ Depth๋ฅผ ์ž์‹ ๋…ธ๋“œ ์ค‘ ์ตœ๋Œ€ Depth+1๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.

 

2๏ธโƒฃ ๊นŠ์ด๊ฐ€ D๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋…ธ๋“œ๊นŒ์ง€ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.

  • DFS ํƒ์ƒ‰ ๊ณผ์ •์—์„œ, Depth ๊ฐ’์ด D๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋…ธ๋“œ๊นŒ์ง€ ์ด๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์นด์šดํŠธํ•œ๋‹ค.
  • ์ด ๋…ธ๋“œ๋“ค์€ ํ˜„๋ฏผ์ด๊ฐ€ ์ง์ ‘ ์ด๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ cnt ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

 

3๏ธโƒฃ ์™•๋ณต ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

  • ๋ชจ๋“  ๋…ธ๋“œ์— ์ „๋‹จ์ง€๋ฅผ ๋Œ๋ฆฌ๊ณ  ๋‹ค์‹œ ์ถœ๋ฐœ ์ง€์ ์œผ๋กœ ๋Œ์•„์™€์•ผ ํ•˜๋ฏ€๋กœ, ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ๊ฐ„์„  ๊ฐœ์ˆ˜์— 2๋ฅผ ๊ณฑํ•ด ์™•๋ณต ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค.

 

๐Ÿ” ์ฐธ๊ณ 

ํŠธ๋ฆฌ๋Š” ์‚ฌ์ดํด์ด ์—†๋Š” ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„์ด๋ฏ€๋กœ, ํŠน์ • ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋กœ ํ‘œํ˜„๋œ๋‹ค.

๋”ฐ๋ผ์„œ, ํ•„์š”ํ•œ ๋ฐฉ๋ฌธ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•œ ํ›„, 2๋ฅผ ๊ณฑํ•˜์—ฌ ์™•๋ณต ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ 1์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

      1
      |
      2
     / \
    3   4
    |
    5
    |
    6
  • S = 1 (์ถœ๋ฐœ์ )
  • D = 1 → ๊นŠ์ด๊ฐ€ 1 ์ดํ•˜์ธ ๋…ธ๋“œ๋Š” ์ž๋™์œผ๋กœ ์ „๋‹จ์ง€ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๊นŠ์ด๊ฐ€ 1์„ ์ดˆ๊ณผํ•˜๋Š” ๋…ธ๋“œ(๊นŠ์ด 2 ์ด์ƒ)๋งŒ ๋ฐฉ๋ฌธํ•˜๋ฉด ๋œ๋‹ค.

D = 1์ธ ๊ฒฝ์šฐ, ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. → ๊นŠ์ด๊ฐ€ 1๋ณด๋‹ค ํฐ ๋…ธ๋“œ ์ง์ ‘ ๋ฐฉ๋ฌธ

   ๋…ธ๋“œ    ๊นŠ์ด    ์ง์ ‘ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
   2    4    โœ…
   3    3    โœ…
   4    1    โŒ (์ž๋™ ๋ฐฐํฌ ๊ฐ€๋Šฅ)
   5    2    โœ…
   6    1    โŒ (์ž๋™ ๋ฐฐํฌ ๊ฐ€๋Šฅ)

๋”ฐ๋ผ์„œ, ์ง์ ‘ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ๋Š” 2, 3, 5๋ฒˆ์ด๋‹ค.

์ฆ‰, ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ cnt = 3์ด๊ณ , ์™•๋ณต ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” 6์ด ๋œ๋‹ค.

 

์œ„ ํ’€์ด๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 64284KB
์‹œ๊ฐ„ : 400ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
    static int n, s, d, cnt;
    static ArrayList<Integer>[] list;
    static int[] depth;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken()); // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜
        s = Integer.parseInt(st.nextToken()); // ์ผ€๋‹ˆ์†Œํ”„ํŠธ์˜ ์œ„์น˜
        d = Integer.parseInt(st.nextToken()); // ํž˜

        list = new ArrayList[n+1];
        for (int i = 0; i <= n; i++) {
            list[i] = new ArrayList<>();
        }

        int x, y;
        for (int i = 1; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            x = Integer.parseInt(st.nextToken());
            y = Integer.parseInt(st.nextToken());

            list[x].add(y);
            list[y].add(x);
        }

        depth = new int[n+1];
        dfs(s, -1);

        // ์™•๋ณต ๊ฐ„์„ ์˜ ๊ฐฏ์ˆ˜ == ์‹œ์ž‘์ ์„ ์ œ์™ธํ•œ ๋ฐฉ๋ฌธ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜*2
        System.out.println(cnt*2);
    }

    private static int dfs(int start, int parent) {
        // ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์œผ๋กœ depth๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ
        for (int next : list[start]) {
            if (next != parent) {
                // ์„œ๋ธŒ๋…ธ๋“œ๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ ๋” ๊นŠ์€ depth ๊ฐ’์„ ์ ์šฉ
                depth[start] = Math.max(depth[start], dfs(next, start)+1);
            }
        }

        // ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ d๊ฐ€ ๋„˜๋Š” ๊ฒฝ์šฐ ํƒ์ƒ‰ํ•˜๋Š” ๋…ธ๋“œ์ด๋ฏ€๋กœ
        // ์‹œ์ž‘์ ์€ ์นด์šดํŠธํ•˜์ง€ ์•Š์•„๋„ ๋จ
        if (start != s && depth[start] >= d) {
            cnt++; // ์นด์šดํŠธ
        }

        return depth[start];
    }
}

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋Š” ๋งค์ผ ํ’€์–ด๋„ ํ’€์–ด๋„ ์ƒˆ๋กญ๊ณ  ์–ด๋ ต๋‹ค..

๊ทธ๋ž˜๋„ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…ํ•˜๋ฉด์„œ ํ•œ ๋ฒˆ ๋” ์ •๋ฆฌ ๊ฒธ ๋ณต์Šตํ•˜๋‹ˆ๊นŒ ์ดํ•ด๊ฐ€ ์ข€ ๋” ์ž˜ ๋˜๋Š” ๊ฒƒ ๊ฐ™๊ธฐ๋„..๐Ÿ˜‚

 

'Algorithm > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Boj_7579] ์•ฑ  (0) 2025.03.25
[Boj_1577] ๋„๋กœ์˜ ๊ฐœ์ˆ˜  (0) 2025.03.19
[Boj_1937] ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค  (0) 2025.03.04
[Boj_22963] 3์ดˆ ์ •๋ ฌ  (0) 2025.02.26
[Boj_2550] ์ „๊ตฌ  (0) 2025.02.20