b24480. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ 2

2025. 3. 1. 14:57ยทAlgorithm & Data Structures/BOJ

 

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

 

 

 

๐Ÿ“Œ ์ž๋ฐ”(Java)๋กœ ํ‘ธ๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS) - ๋ฐฑ์ค€ 24480 ๋ฌธ์ œ ํ’€์ด ๐Ÿš€


๐Ÿ”Ž ๋ฌธ์ œ ๊ฐœ์š”

์ด ๋ฌธ์ œ๋Š” ๋ฐฑ์ค€ 24480๋ฒˆ - ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ 2 ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„๋ฅผ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)ํ•˜๋ฉฐ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ๊ธฐ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‹จ, ๋‚ด๋ฆผ์ฐจ์ˆœ(ํฐ ์ˆซ์ž๋ถ€ํ„ฐ) ์œผ๋กœ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค.


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

5 5 1
1 4
1 2
2 3
2 4
3 4

๐Ÿ’ก ์˜ˆ์ œ ์ถœ๋ ฅ

1
4
3
2
0

โžก 1๋ฒˆ ์ •์ ๋ถ€ํ„ฐ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ DFS ํƒ์ƒ‰ํ•˜๋ฉฐ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


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

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰) + ์ •๋ ฌ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

โœ๏ธ ์ฃผ์š” ๊ณ ๋ ค ์‚ฌํ•ญ

โœ” DFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰
โœ” ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋•Œ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
โœ” ์ •์  ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ isVisited[] ๋ฐฐ์—ด์— ๊ธฐ๋ก


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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class b24480 {

    static int N, M, R, count = 1; // ์ •์  ์ˆ˜, ๊ฐ„์„  ์ˆ˜, ์‹œ์ž‘ ์ •์ , ๋ฐฉ๋ฌธ ์ˆœ์„œ ์นด์šดํŠธ
    static ArrayList<Integer>[] list; // ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ
    static int[] isVisited; // ๋ฐฉ๋ฌธ ์ˆœ์„œ ์ €์žฅ ๋ฐฐ์—ด

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        // ์ž…๋ ฅ ์ฒ˜๋ฆฌ
        N = sToInt(st.nextToken()); // ์ •์  ๊ฐœ์ˆ˜
        M = sToInt(st.nextToken()); // ๊ฐ„์„  ๊ฐœ์ˆ˜
        R = sToInt(st.nextToken()); // ์‹œ์ž‘ ์ •์ 

        isVisited = new int[N + 1]; // ๋ฐฉ๋ฌธ ์ˆœ์„œ ์ €์žฅ ๋ฐฐ์—ด
        list = new ArrayList[N + 1];

        // ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
        for (int i = 0; i <= N; i++) {
            list[i] = new ArrayList<>();
        }

        // ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int a = sToInt(st.nextToken());
            int b = sToInt(st.nextToken());
            list[a].add(b);
            list[b].add(a);
        }

        // ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ (ํฐ ์ˆซ์ž๋ถ€ํ„ฐ ํƒ์ƒ‰)
        for (int i = 1; i <= N; i++) {
            list[i].sort(Collections.reverseOrder());
        }

        // DFS ์‹คํ–‰
        DFS(R);

        // ๊ฒฐ๊ณผ ์ถœ๋ ฅ
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= N; i++) {
            sb.append(isVisited[i]).append("\n");
        }
        System.out.println(sb);
    }

    // ๋ฌธ์ž์—ด -> ์ •์ˆ˜ ๋ณ€ํ™˜ ํ•จ์ˆ˜
    static int sToInt(String s) {
        return Integer.parseInt(s);
    }

    // ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ (DFS)
    static void DFS(int start) {
        isVisited[start] = count++; // ๋ฐฉ๋ฌธ ์ˆœ์„œ ๊ธฐ๋ก

        for (int next : list[start]) { // ์—ฐ๊ฒฐ๋œ ์ •์  ์ˆœํšŒ
            if (isVisited[next] == 0) { // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
                DFS(next);
            }
        }
    }
}

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

๐Ÿ“Œ 1. ์ž…๋ ฅ ์ฒ˜๋ฆฌ ๋ฐ ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”

N = sToInt(st.nextToken()); // ์ •์  ๊ฐœ์ˆ˜
M = sToInt(st.nextToken()); // ๊ฐ„์„  ๊ฐœ์ˆ˜
R = sToInt(st.nextToken()); // ์‹œ์ž‘ ์ •์ 

isVisited = new int[N + 1]; // ๋ฐฉ๋ฌธ ์ˆœ์„œ ์ €์žฅ ๋ฐฐ์—ด
list = new ArrayList[N + 1];

// ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
for (int i = 0; i <= N; i++) {
    list[i] = new ArrayList<>();
}
  • ์ •์  ๊ฐœ์ˆ˜(N), ๊ฐ„์„  ๊ฐœ์ˆ˜(M), ์‹œ์ž‘ ์ •์ (R) ์„ ์ž…๋ ฅ๋ฐ›์Œ
  • isVisited[] ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ๊ธฐ๋ก
  • list[] ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ €์žฅ

๐Ÿ“Œ 2. ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ ๋ฐ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ

// ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ
for (int i = 0; i < M; i++) {
    st = new StringTokenizer(br.readLine());
    int a = sToInt(st.nextToken());
    int b = sToInt(st.nextToken());
    list[a].add(b);
    list[b].add(a);
}

// ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ (ํฐ ์ˆซ์ž๋ถ€ํ„ฐ ํƒ์ƒ‰)
for (int i = 1; i <= N; i++) {
    list[i].sort(Collections.reverseOrder());
}
  • ArrayList[]๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ €์žฅ
  • ์ •์  ๋ฒˆํ˜ธ๊ฐ€ ํฐ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์œ„ํ•ด Collections.reverseOrder()๋กœ ์ •๋ ฌ

๐Ÿ“Œ 3. DFS ํƒ์ƒ‰

// DFS ์‹คํ–‰
DFS(R);
  • ์‹œ์ž‘ ์ •์ (R)๋ถ€ํ„ฐ DFS ํƒ์ƒ‰์„ ์‹œ์ž‘

๐Ÿ“Œ 4. DFS ํƒ์ƒ‰ ๊ตฌํ˜„

static void DFS(int start) {
    isVisited[start] = count++; // ๋ฐฉ๋ฌธ ์ˆœ์„œ ๊ธฐ๋ก

    for (int next : list[start]) { // ์—ฐ๊ฒฐ๋œ ์ •์  ์ˆœํšŒ
        if (isVisited[next] == 0) { // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
            DFS(next);
        }
    }
}
  • DFS๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ๊ธฐ๋ก
  • ์—ฐ๊ฒฐ๋œ ์ •์  ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์ ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธ
  • ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ •์ ์€ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์Œ

๐Ÿ”ฅ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

์—ฐ์‚ฐ  ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ˆ˜ํ–‰ ํšŸ์ˆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ ์‹œ๊ฐ„ ๋ณต์žก๋„
๊ฐ„์„  ์ž…๋ ฅ ๋ฐ ์ •๋ ฌ M log M O(M log M)
DFS ํƒ์ƒ‰ N + M O(N + M)
์ดํ•ฉ   O(N + M log M)

โœ… ๋น ๋ฅธ DFS ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ทธ๋ž˜ํ”„์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๋”๋ผ๋„ ํšจ์œจ์ 


๐Ÿ† ์ •๋ฆฌ

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

โœ” DFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ๊ธฐ๋ก
โœ” ์ •์ ์ด ํฐ ์ˆซ์ž๋ถ€ํ„ฐ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
โœ” ๋ฐฉ๋ฌธ ์ˆœ์„œ๋Š” isVisited[] ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅ


๐ŸŽฏ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์žฅ์ 

โœ… DFS๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ ๊ฐ€๋Šฅ
โœ… ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ + ์ •๋ ฌ์„ ํ†ตํ•ด ์ •์  ๋ฐฉ๋ฌธ ์ˆœ์„œ ์ œ์–ด ๊ฐ€๋Šฅ
โœ… O(N + M log M) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ํšจ์œจ์ ์ธ ํƒ์ƒ‰ ๊ฐ€๋Šฅ


์ด ๊ธ€์ด ๋„์›€์ด ๋˜์…จ๋‹ค๋ฉด ์ข‹์•„์š”์™€ ๊ณต์œ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!
๊ถ๊ธˆํ•œ ์ ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”! ๐Ÿ˜Š

 

 

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

b24445. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ 2  (1) 2025.03.06
b24444. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ 1  (0) 2025.03.04
b3015. ์˜ค์•„์‹œ์Šค ์žฌ๊ฒฐํ•ฉ  (0) 2025.02.25
b.1725 ํžˆ์Šคํ† ๊ทธ๋žจ  (0) 2025.02.06
b.17299 ์˜ค๋“ฑํฐ์ˆ˜  (1) 2025.02.04
'Algorithm & Data Structures/BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • b24445. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ 2
  • b24444. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ 1
  • b3015. ์˜ค์•„์‹œ์Šค ์žฌ๊ฒฐํ•ฉ
  • b.1725 ํžˆ์Šคํ† ๊ทธ๋žจ
Geisha
Geisha
๊ฐœ๋ฐœ ์ผ๊ธฐ
  • Geisha
    Geisha
    Geisha
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (313) N
      • Algorithm & Data Structures (235) N
        • BOJ (93) N
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (25) N
        • SQL (19) N
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • ์šด์˜์ฒด์ œ (13)
        • ๋„คํŠธ์›Œํฌ (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    PriorityQueue
    binarySearch
    dp
    ์ด๋ถ„ํƒ์ƒ‰
    ๋™์ ๊ณ„ํš๋ฒ•
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    ๋ฐฑ์ค€
    Java
    ๋ฐฑํŠธ๋ž˜ํ‚น
    ํˆฌํฌ์ธํ„ฐ
    ๊ณจ๋“œ
    ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    DynamicProgramming
    Union-Find
    ์Šคํƒ
    SQL
    ๊ฒฝ๋กœ์••์ถ•
    Stack
    dfs
    unionfind
    baekjoon
    ๋‹ค์ต์ŠคํŠธ๋ผ
    ์ „์œ„์ˆœํšŒ
    BFS
    algorithm
    ๊ตฌํ˜„
    Dijkstra
    ํ›„์œ„์ˆœํšŒ
    programmers
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Geisha
b24480. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ 2
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”