๐Ÿ’ซAlgorithm

DFS, BFS ๊ตฌํ˜„๋ฐฉ๋ฒ• ( + [๋ฐฑ์ค€] 2606 ๋ฐ”์ด๋Ÿฌ์Šค ๋ฌธ์ œํ’€์ด)

์—ฐ_์šฐ๋ฆฌ 2022. 2. 12. 01:26
๋ฐ˜์‘ํ˜•

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

 

2606๋ฒˆ: ๋ฐ”์ด๋Ÿฌ์Šค

์ฒซ์งธ ์ค„์—๋Š” ์ปดํ“จํ„ฐ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ปดํ“จํ„ฐ์˜ ์ˆ˜๋Š” 100 ์ดํ•˜์ด๊ณ  ๊ฐ ์ปดํ“จํ„ฐ์—๋Š” 1๋ฒˆ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ปดํ“จํ„ฐ ์Œ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด

www.acmicpc.net

 

 

 

DFS (Depth-First Search)

DFS๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋‹ค. 

์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ•œ ๊ณณ๋งŒ ๊นŠ๊ฒŒ~ ๊ณ„์† ํŒŒ๋‹ค๊ฐ€ ๋์ด ๋‚˜์˜ค๋ฉด, ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ๊ฐ€์„œ ๋‹ค์‹œ ๊นŠ๊ฒŒ~ ๊ณ„์† ํŒŒ๋Š” ๊ฒƒ์ด๋‹ค.

https://commons.wikimedia.org/wiki/File:Depth-First-Search.gif

 - ๋‹จ์ˆœ ๊ฒ€์ƒ‰์€ BFS๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค

 - ๋ชจ๋“  ๊ณณ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

 - ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ํƒ์ƒ‰ ๋…ธ๋“œ(ํ˜„์žฌ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•˜๊ณ , ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ๋…ธ๋“œ)๋กœ ์ด๋™ํ•œ๋‹ค.

 

BFS (Breadth-First Search)

BFS๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์˜†์œผ๋กœ ๋„“๊ฒŒ~ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ณ  ์ฐพ๋Š” ๊ฐ’์ด ์—†์œผ๋ฉด, ํ•œ ๋‹จ๊ณ„ ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€์„œ ๋‹ค์‹œ ๋„“๊ฒŒ~ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

https://commons.wikimedia.org/wiki/File:Breadth-First-Search-Algorithm.gif

 - ๋‹จ์ˆœ ๊ฒ€์ƒ‰์€ DFS๋ณด๋‹ค ๋น ๋ฅด๋‹ค.

 - ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค

 - Queue๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ํƒ์ƒ‰ ๋…ธ๋“œ(ํ˜„์žฌ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•˜๊ณ , ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ๋…ธ๋“œ)๋ฅผ ์ €์žฅํ•œ๋‹ค. 

 

 

DFS ๋ฌธ์ œํ’€์ด

node[a][b] = node[b][a] = 1 

 : ๊ฐ ๋…ธ๋“œ๋“ค์€ ๋ฐฉํ–ฅ์„ฑ์ด ์—†๋‹ค. ๋ฐฉํ–ฅ์„ฑ์ด ์—†์œผ๋‹ˆ 2๋ฒˆ์—์„œ 5๋ฒˆ์œผ๋กœ ๊ฐˆ์ˆ˜๋„, 5๋ฒˆ์—์„œ 2๋ฒˆ์œผ๋กœ ๊ฐˆ์ˆ˜๋„ ์žˆ๋‹ค.

 : ๋Œ€์นญ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ์ข€ ๋” ์‰ฝ๊ฒŒ ํƒ์ƒ‰์ด ๋๋‚  ์ˆ˜ ์žˆ๋‹ค.

 

dfs ๋ถ€๋ถ„์€ ์ฃผํ™ฉ์ƒ‰๋ถ€๋ถ„์— ์ž์„ธํ•˜๊ฒŒ ์ ์–ด๋†จ์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ ์ฝ์–ด๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ดํ•ด๋ ๊ฒƒ์ด๋‹ค!

dfs ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๋” ๊นŠ๊ฒŒ ํƒ์ƒ‰ํ•œ๋‹ค

 

DFS ์ œ์ถœ์ฝ”๋“œ

package baekjoon;

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

public class Main2606_dfs {
    /*
    7       //์ปดํ“จํ„ฐ์˜ ์ˆ˜
    6       //๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ์ปดํ“จํ„ฐ ์Œ์˜ ์ˆ˜
    1 2     // 1-2 ์—ฐ๊ฒฐ๋จ
    2 3     // 2-3 ์—ฐ๊ฒฐ๋จ
    1 5     // 1-5 ์—ฐ๊ฒฐ๋จ
    5 2     // 5-2 ์—ฐ๊ฒฐ๋จ
    5 6     // 5-6 ์—ฐ๊ฒฐ๋จ
    4 7     // 4-7 ์—ฐ๊ฒฐ๋จ
    * */
    static int[][] node;
    static boolean[] check; //๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฐ์—ผ๋˜์—ˆ๋Š”์ง€
    static int count = 0;   //๊ฐ์—ผ ์ปดํ“จํ„ฐ ์ˆ˜
    static int computers;
    static int pairs;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        computers = Integer.parseInt(br.readLine());
        pairs = Integer.parseInt(br.readLine());

        node = new int[computers+1][computers+1];
        check = new boolean[computers+1];
        for (int i = 0; i < pairs; i++) {
             StringTokenizer st = new StringTokenizer(br.readLine(), " ");
             int a = Integer.parseInt(st.nextToken());
             int b = Integer.parseInt(st.nextToken());
             node[a][b] = 1;
             node[b][a] = 1;
             //๋ฐฉํ–ฅ์„ฑ์ด ์—†๊ธฐ๋•Œ๋ฌธ์—
        }

        dfs(1);
        System.out.println(count-1);

    }


    public static void dfs(int start) {
        check[start] = true;    // 1๋ฒˆ (start) ๊ฐ์—ผ
        count++;    //๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ ์ˆ˜ ์ฆ๊ฐ€

        for (int i = 0; i <= computers; i++) {  //์ปดํ“จํ„ฐ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต
            if (node[start][i] == 1 && !check[i]) {    //node[start][i] == 1 : 1๋ฒˆ(start)๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ผ๋ฉด     //!check[i] : i๋ฒˆ ์ปดํ“จํ„ฐ๊ฐ€ ๊ฐ์—ผ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด
                dfs(i); // i๋ฒˆ ์ปดํ“จํ„ฐ ๊ฐ์—ผ์ฒ˜๋ฆฌ๋ฆฌ            
            }
        }
    }

}

 

 

 

BFS ๋ฌธ์ œํ’€์ด

node[a][b] = node[b][a] = 1

 : ๊ฐ ๋…ธ๋“œ๋“ค์€ ๋ฐฉํ–ฅ์„ฑ์ด ์—†๋‹ค. ๋ฐฉํ–ฅ์„ฑ์ด ์—†์œผ๋‹ˆ 2๋ฒˆ์—์„œ 5๋ฒˆ์œผ๋กœ ๊ฐˆ์ˆ˜๋„, 5๋ฒˆ์—์„œ 2๋ฒˆ์œผ๋กœ ๊ฐˆ์ˆ˜๋„ ์žˆ๋‹ค.

 : ๋Œ€์นญ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ์ข€ ๋” ์‰ฝ๊ฒŒ ํƒ์ƒ‰์ด ๋๋‚  ์ˆ˜ ์žˆ๋‹ค.

 

bfs ๋ถ€๋ถ„์€ ์ฃผํ™ฉ์ƒ‰๋ถ€๋ถ„์˜ ํ๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€๋ณด์ž!

bfs ํ•จ์ˆ˜๋Š” 1๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๊ณ , ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋‹ค์Œ์— ์–ด๋–ค ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•  ๊ฒƒ์ธ์ง€๋ฅผ queue์— ์ €์žฅํ•œ๋‹ค.

ํ˜„์žฌ ๋…ธ๋“œ ํƒ์ƒ‰์ด ๋๋‚˜๋ฉด, queue์— ์ €์žฅํ•ด๋‘” ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์–ด ํƒ์ƒ‰ํ•œ๋‹ค.

 

 

BFS ์ œ์ถœ์ฝ”๋“œ

package baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main2606_bfs {
    /*
    7       //์ปดํ“จํ„ฐ์˜ ์ˆ˜
    6       //๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ์ปดํ“จํ„ฐ ์Œ์˜ ์ˆ˜
    1 2     // 1-2 ์—ฐ๊ฒฐ๋จ
    2 3     // 2-3 ์—ฐ๊ฒฐ๋จ
    1 5     // 1-5 ์—ฐ๊ฒฐ๋จ
    5 2     // 5-2 ์—ฐ๊ฒฐ๋จ
    5 6     // 5-6 ์—ฐ๊ฒฐ๋จ
    4 7     // 4-7 ์—ฐ๊ฒฐ๋จ
    * */
    static int[][] node;
    static boolean[] check; //๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฐ์—ผ๋˜์—ˆ๋Š”์ง€
    static int count = 0;   //๊ฐ์—ผ ์ปดํ“จํ„ฐ ์ˆ˜
    static Queue<Integer> queue = new LinkedList<>();
    static int computers;
    static int pairs;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        computers = Integer.parseInt(br.readLine());
        pairs = Integer.parseInt(br.readLine());

        node = new int[computers+1][computers+1];
        check = new boolean[computers+1];
        for (int i = 0; i < pairs; i++) {
             StringTokenizer st = new StringTokenizer(br.readLine(), " ");
             int a = Integer.parseInt(st.nextToken());
             int b = Integer.parseInt(st.nextToken());
             node[a][b] = 1;
             node[b][a] = 1;
             //๋ฐฉํ–ฅ์„ฑ์ด ์—†๊ธฐ๋•Œ๋ฌธ์—
        }

        bfs(1);
        System.out.println(count);

    }

    public static void bfs(int start) {
        queue.offer(start);
        check[start] = true;    // 1๋ฒˆ (start) ๊ฐ์—ผ

        while(!queue.isEmpty()){
            int temp = queue.poll();
            for (int i = 0; i <= computers; i++) {
                 if(node[temp][i] == 1 && !check[i]) {
                     queue.offer(i);
                     check[i] = true;
                     count++;
                 }
            }
        }
    }

}
๋ฐ˜์‘ํ˜•
  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
  • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ