๐Ÿ€ Knowledge/์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] DFS์™€ BFS ๋‹ค๋ฃจ๊ธฐ

TIlearn 2023. 8. 25. 00:02

DFS์™€ BFS๋Š” ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ ํ•ญ์ƒ ๋‹จ๊ณจ ๋ฌธ์ œ๋กœ ์ถœ์ œ๋˜๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์— ํ•˜๋‚˜์ด๋‹ค.

์ด์ œ๋ถ€ํ„ฐ ์–ด๋– ํ•œ ๊ฒฝ์šฐ์— DFS์™€ BFS ๋ฌธ์ œ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ ์ž‘์„ฑํ•ด ๋ณธ๋‹ค.

 

 

DFS

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์€ ๊ทธ๋ž˜ํ”„ ์™„์ „ ํƒ์ƒ‰ ๊ธฐ๋ฒ• ์ค‘์— ํ•˜๋‚˜๋กœ, ๊ทธ๋ž˜ํ”„์˜ ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ, ํƒ์ƒ‰ํ•  ํ•œ ์ชฝ ๋ถ„๊ธฐ๋ฅผ ์ •ํ•ด ํƒ์ƒ‰์„ ๋งˆ์นœ ํ›„, ๋‹ค๋ฅธ ๋ถ„๊ธฐ๋กœ ์ด๋™ํ•˜์—ฌ ํƒ์ƒ‰์„ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

 

DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)์˜ ํŠน์ง•

- ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.(์ค‘์š”)
- ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

์‹ค์ œ ๋ฌธ์ œ ํ’€์ด์—์„œ DFS๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ, ์ด ๋•Œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

DFS ๋ฌธ์ œ์— ๋Œ€ํ•œ ์œ ํ˜•์€ ์ฃผ๋กœ, ๋‹จ์ ˆ์  ์ฐพ๊ธฐ, ๋‹จ์ ˆ์„  ์ฐพ๊ธฐ, ์‚ฌ์ดํด ์ฐพ๊ธฐ, ์œ„์ƒ ์ •๋ ฌ ๋“ฑ์˜ ๋ฌธ์ œ์ด๋‹ค.

 

 

 

DFS ๋ฌธ์ œ ์˜ˆ์‹œ

 

11724๋ฒˆ: ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ๊ฐ„์„ ์˜ ์–‘ ๋์  u์™€ v๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ u, v ≤ N, u ≠ v) ๊ฐ™์€ ๊ฐ„์„ ์€ ํ•œ ๋ฒˆ๋งŒ ์ฃผ์–ด

www.acmicpc.net

๋ฐฑ์ค€ 11724๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ DFS ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

import java.util.*;
import java.io.*;
public class Main {
    static ArrayList<Integer>[] A;
    static boolean visited[];

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

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        A = new ArrayList[N+1];
        visited = new boolean[N+1];
        for(int i=1; i<N+1; i++) {
            A[i] = new ArrayList<Integer>();
        }
        for(int i=0; i<M; i++) {
            st = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());
            A[s].add(e);
            A[e].add(s);
        }
        int count = 0;
        for(int i=1; i<N+1; i++) {
            if(!visited[i]) {
                count++;
                DFS(i);
            }
        }
        System.out.println(count);
    }
    static void DFS(int v) {
        if (visited[v]) {
            return;
        }
        visited[v] = true;
        for(int i: A[v]) {
            if(visited[i] == false) {
                DFS(i);
            }
        }
    }
}

 

DFS๋‚˜ BFS๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ œ๋Š” ์œ„์™€ ๊ฐ™์ด ๋…ธ๋“œ์™€ ์—์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ ๋…ธ๋“œ๋“ค์ด ์–ด๋–ค ๋…ธ๋“œ์™€ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ง€ ์—ฐ๊ฒฐํ•˜์—ฌ ์ €์žฅํ•˜์—ฌ์•ผ ํ•˜๋Š”๋ฐ,

์ด ๋•Œ ์ž๋ฐ”์—์„œ๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(ArrayList) ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์™€ ๊ฐ™์€ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•œ๋‹ค.

 

 

- DFS๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋•Œ๊ฐ€ ๋งŽ๋‹ค.(๊ฐœ๋…์€ ์Šคํƒ)

- ๋ฐฉ๋ฌธ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์•ˆ์˜ ๊ฐ’๋“ค์„ ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉฐ ํƒ์ƒ‰ํ•œ๋‹ค.

 

 

 

DFS ๋ฌธ์ œ ์˜ˆ์‹œ 2

 

 

2023๋ฒˆ: ์‹ ๊ธฐํ•œ ์†Œ์ˆ˜

์ˆ˜๋นˆ์ด๊ฐ€ ์„ธ์ƒ์—์„œ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์€ ์†Œ์ˆ˜์ด๊ณ , ์ทจ๋ฏธ๋Š” ์†Œ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๊ฒƒ์ด๋‹ค. ์š”์ฆ˜ ์ˆ˜๋นˆ์ด๊ฐ€ ๊ฐ€์žฅ ๊ด€์‹ฌ์žˆ์–ด ํ•˜๋Š” ์†Œ์ˆ˜๋Š” 7331์ด๋‹ค. 7331์€ ์†Œ์ˆ˜์ธ๋ฐ, ์‹ ๊ธฐํ•˜๊ฒŒ๋„ 733๋„ ์†Œ์ˆ˜์ด๊ณ , 73๋„ ์†Œ์ˆ˜

www.acmicpc.net

 

๋‹ค์Œ์€ ๋ฐฑ์ค€ 2023๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ์กฐ๊ธˆ ๋” ์–ด๋ ค์šด DFS ๋ฌธ์ œ์˜ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์ž๋ฆฟ์ˆ˜ ๋ณ„๋กœ ํƒ์ƒ‰์„ ํ•ด๋‚˜๊ฐ€๋ฉฐ, ์†Œ์ˆ˜์ž„์„ ๋ฐํ˜€๋‚ด๋Š” ๋ฌธ์ œ์ธ๋ฐ,

์—ฌ๊ธฐ์„œ DFS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ ์ ˆํ•œ ๊ฐ€์ง€์น˜๊ธฐ์™€ ํƒ์ƒ‰์„ ๋ณ‘ํ–‰ํ•˜์—ฌ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

import java.util.*;
import java.io.*;
public class Main {
    static int n;

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

        DFS(2, 1);
        DFS(3, 1);
        DFS(5, 1);
        DFS(7, 1);
    }

    static void DFS(int num, int jarisu) {
        if(jarisu == n) {
            if (isPrime(num)) {
                System.out.println(num);
            }
        }
        for(int i=1; i<=9; i++) {
            if(i % 2 == 1 && isPrime(num)) {
                DFS(num * 10 + i, jarisu +1);
            }
        }
    }


    static boolean isPrime(int num) {
        for(int i=2; i<=num/2; i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }

}

 

 

- ์ฒซ ๋ฒˆ์งธ ์ž๋ฆฟ์ˆ˜๋Š” ์†Œ์ˆ˜ ๊ทธ ์ž์ฒด ๋ฐ–์— ๋ชป ์˜ค๋ฏ€๋กœ, 2, 3, 5, 7 ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

- ๊ทธ ๋‹ค์Œ ์ž๋ฆฟ์ˆ˜๋Š” ์ง์ˆ˜๋Š” ์•ˆ๋˜๋ฏ€๋กœ(10์ด์ƒ์˜ ์ง์ˆ˜ ์ค‘์— ์†Œ์ˆ˜๋Š” ์—†์Œ), ํ™€์ˆ˜๋งŒ ๊ฐ€์ง€์น˜๊ธฐ

- ์ฆ‰, ์ด ๋ฌธ์ œ์—์„œ์˜ DFS๋Š” ์ž๋ฆฟ์ˆ˜์™€ ์†Œ์ˆ˜ ํŒ๋ณ„์„ ํ†ตํ•ด ๊ตฌ์„ฑ๋œ๋‹ค.

 

 

 

DFS ๋ฌธ์ œ ์˜ˆ์‹œ 3

 

 

 

13023๋ฒˆ: ABCDE

๋ฌธ์ œ์˜ ์กฐ๊ฑด์— ๋งž๋Š” A, B, C, D, E๊ฐ€ ์กด์žฌํ•˜๋ฉด 1์„ ์—†์œผ๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

์‚ฌ์‹ค ์ด ๋ฌธ์ œ๋Š” DFS์˜ ๊ฐœ๋…์„ ๋„์ž…ํ•  ์ค„ ๋งŒ ์•Œ๋ฉด, ๊ทธ๋ ‡๊ฒŒ ๋†’์€ ๋“ฑ๊ธ‰์˜ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์žฌ๊ท€ ๊นŠ์ด ์ž์ฒด๊ฐ€ ๋‹ต์„ ๋„์ถœํ•˜๋Š” ํ•ต์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

import java.util.*;
import java.io.*;
public class Main {

    static ArrayList<Integer>[] A;
    static boolean[] visited;
    static boolean arrive;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        visited = new boolean[n];
        A = new ArrayList[n];

        arrive = false;
        for(int i=0; i<n; i++) {
            A[i] = new ArrayList<>();
        }

        for(int i=0; i<m; i++) {
            st = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());

            A[s].add(e);
            A[e].add(s);
        }

        for(int i=0; i<n; i++) {
            DFS(i, 1);

            if(arrive) {
                break;
            }
        }

        if (arrive) {
            System.out.println("1");
        } else {
            System.out.println("0");
        }


    }

    static void DFS(int now, int depth) {
        if (depth == 5 || arrive) {
            arrive = true;
            return;
        }

        visited[now] = true;

        for(int i : A[now]) {
            if (!visited[i]) {
                DFS(i, depth+1);
            }
        }
        visited[now] = false;
    }

}

 

- DFS์—์„œ๋Š” ์—ฐ๊ฒฐ๋œ ์—์ง€์— ๋Œ€ํ•ด์„œ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๊ณ„์† ํ˜ธ์ถœํ•  ๊ฒƒ์ด๋‹ค.

- ์ด ๋ง์˜ ์˜๋ฏธ๋Š” ํ˜ธ์ถœ๋œ ํšŸ์ˆ˜๊ฐ€ ์นœ๊ตฌ์˜ ์ˆ˜์™€ ๊ฐ™๋‹ค๋ฉด, ์นœ๊ตฌ๋“ค๋ผ๋ฆฌ๋Š” ๋Š์–ด์ง„ ๊ณณ ์—†์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

- ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ตํ•ด์„œ ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ’€์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 


 

 

 

BFS

 

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰๋˜ํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ์™„์ „ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘์— ํ•˜๋‚˜์ด๋‹ค. ์ด๋Š” ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ฅผ ๋จผ์ € ๋ฐฉ๋ฌธํ•˜๋ฉฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)์˜ ํŠน์ง•

- FIFO ํƒ์ƒ‰์ด๋‹ค.

- Queue ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

๋˜ํ•œ ๋…ธ๋“œ ์ˆ˜(V)์™€ ์—์ง€ ์ˆ˜(E)์— ๋”ฐ๋ผ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๊ฒฐ์ •๋จ์€ DFS์™€ ๋™์ผํ•˜๋‹ค.(O(V+E))

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์€ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰๊ณผ ์–ด๋–ค ์ ์—์„œ ์ฐจ์ด์ ์„ ๋‘˜๊นŒ? ๊ทธ๊ฑด ๋ฐ”๋กœ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์€ ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ์™€ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ฅผ ์šฐ์„ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ์— ๋ชฉํ‘œ ๋…ธ๋“œ๋กœ ๋„์ฐฉํ•˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์ผ ๋•Œ, ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

 

์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ณด์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ต‰์žฅํ•œ ์ด์ ์ด์ž, ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉด์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

 

How to Work?

 

์ด์ „์˜ DFS๋Š” ์žฌ๊ท€ํ•จ์ˆ˜(์Šคํƒ)๋ฅผ ์ด์šฉํ–ˆ๋‹ค. BFS๋„ ์ด๋ฆ„์€ ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ, ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™๋˜๋Š” ๊ฒƒ์€ ๋ถ„๋ช… ์•„๋‹ ๊ฒƒ์ด๋‹ค.

 

BFS๋Š” ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์˜ DFS๋Š” ์Šคํƒ ๋Œ€์‹  ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, BFS๋Š” ํ ์ž๋ฃŒ๊ตฌ์กฐ ๊ทธ ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ๊ฐ„ํŽธํ•˜๋‹ค.

 

๋‹จ, DFS์™€ ๋™์ผํ•˜๊ฒŒ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์Šคํƒ(์žฌ๊ท€ํ•จ์ˆ˜)์— ์ง‘์–ด ๋„ฃ์—ˆ๋˜ ๊ฒƒ๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ํ์— ์‚ฝ์ž…ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

- BFS๋Š” ๊ตฌํ˜„์— ์žˆ์–ด์„œ Queue ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.

- BFS๋„ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

BFS ๋ฌธ์ œ ์˜ˆ์‹œ 1

 

์—„๋ฐ€ํžˆ ๋งํ•ด์„œ ์ด ๋ฌธ์ œ๋Š” DFS์™€ BFS๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ์ข‹์€ ์˜ˆ์‹œ์ด๋‹ค.

 

 

 

 

import java.util.*;
import java.io.*;
public class Main {

    static ArrayList<Integer>[] A;
    static boolean[] visited;


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

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int start = Integer.parseInt(st.nextToken());

        A = new ArrayList[n+1];

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

        for(int i=0; i<m; i++) {
            st = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());

            A[s].add(e);
            A[e].add(s);
        }

        for(int i=1; i<=n; i++) {
            Collections.sort(A[i]);
        }

        visited = new boolean[n+1];

        DFS(start);

        System.out.println();
        visited = new boolean[n+1];
        BFS(start);
        System.out.println();



    }

    public static void DFS(int Node) {
        System.out.print(Node + " ");
        visited[Node] = true;
        for(int i: A[Node]) {
            if (!visited[i]) {
                DFS(i);
            }
        }
    }

    private static void BFS(int Node) {
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.add(Node);
        visited[Node] = true;

        while(!queue.isEmpty()) {
            int now_node = queue.poll();
            System.out.print(now_node + " ");
            for(int i : A[now_node]) {
                if (!visited[i]) {
                    visited[i] = true;
                    queue.add(i);
                }
            }
        }
    }

}

 

์œ„ ์ฒ˜๋Ÿผ BFS ๊ตฌํ˜„ ์‹œ์—๋Š” Queue ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

BFS์—์„œ๋Š”?

- Queue ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

- ๋ฐฉ๋ฌธ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค.

- queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š”๋ฐ, poll ํ•œ ๊ฐ’์˜ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฐจ๋ก€๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉฐ, ํ์— ์‚ฝ์ž…ํ•œ๋‹ค.

 

 

 

BFS ๋ฌธ์ œ ์˜ˆ์‹œ 2

 

์ด ๋ฌธ์ œ๋Š” BFS ๋ฌธ์ œ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋ฏธ๋กœ ํƒ์ƒ‰์— ๊ด€ํ•œ ๋ฌธ์ œ์ด๋‹ค.

 

 

2178๋ฒˆ: ๋ฏธ๋กœ ํƒ์ƒ‰

์ฒซ์งธ ์ค„์— ๋‘ ์ •์ˆ˜ N, M(2 ≤ N, M ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” M๊ฐœ์˜ ์ •์ˆ˜๋กœ ๋ฏธ๋กœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ๊ฐ์˜ ์ˆ˜๋“ค์€ ๋ถ™์–ด์„œ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

 

 

import java.util.*;
import java.io.*;
public class Main {

    static int[][] A;
    static int n, m;
    static boolean[][] visited;
    static int[] dx = { 0, 1, 0, -1 };
    static int[] dy = { 1, 0, -1, 0 };

    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());
        m = Integer.parseInt(st.nextToken());
        A = new int[n][m];
        visited = new boolean[n][m];


        for(int i=0; i<n; i++) {
            st = new StringTokenizer(br.readLine());
            String line = st.nextToken();
            for(int j=0; j<m; j++) {
                A[i][j] = Integer.parseInt(line.substring(j, j+1));
            }
        }

        BFS(0, 0);
        System.out.println(A[n-1][m-1]);
    }

    public static void BFS(int i, int j) {
        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[] { i, j});
        visited[i][j] = true;
        while(!queue.isEmpty()) {
            int now[] = queue.poll();
            for(int k=0; k<4; k++) {
                int x = now[0] + dx[k];
                int y = now[1] + dy[k];
                if(x >= 0 && y >=0 && x<n && y<m) {
                    if(A[x][y] != 0 && !visited[x][y]) {
                        visited[x][y] = true;
                        A[x][y] = A[now[0]][now[1]] + 1;
                        queue.add(new int[] { x, y });
                    }
                }
            }
        }

    }

}

 

๊ฐœ๋…๋งŒ ์ œ๋Œ€๋กœ ์ˆ™์ง€ํ•˜๋Š” ๊ณ ์ˆ˜๋‹˜๋“ค์€ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ต์ˆ™์น˜ ์•Š์€ ์ด๋“ค์—๊ฒŒ๋Š” ์ƒ์†Œํ•œ ๋ฐฉ์‹์ด๋‹ค.

์ž…๋ ฅ ๋ฐ›๋Š” ๋ถ€๋ถ„๋„ ํŒŒ์ด์ฌ์œผ๋กœ ํ•œ๋‹ค๋ฉด, ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค. ํ•˜์ง€๋งŒ, StringTokenizer์™€ substring์„ ํ†ตํ•ด์„œ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋ฐ›๋Š” ๋ฐฉ์‹์€ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ๋„ ํ•˜๊ณ , ์†๋ชฉ ๊ด€์ ˆ์— ์•…์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ๋„ ํ•œ๋‹ค.(๋ฌผ๋ก  ๋‚œ ์ฝ”๋”ฉ ๊ณ ์ˆ˜๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด์–ด์„œ ์ข‹๋‹ค.. ํ•˜ํ•˜)

 

- ๋ฐฉํ–ฅ ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ž.(dx์™€ dy๋ฅผ ์„ ์–ธํ•ด ์คŒ์œผ๋กœ์จ, for๋ฌธ์œผ๋กœ ์‰ฝ๊ฒŒ ๋ฐฉ๋ฌธ ์ ˆ์ฐจ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.)

- Queue์˜ ๊ฐ ์š”์†Œ๋Š” ํ–‰๊ณผ ์—ด์˜ ๊ฐ index ๊ฐ’์„ ๊ฐ€์ง„ ๊ฐ’์ด๋‹ค. ๊ทธ๋ž˜์•ผ, ๊ฐ๊ฐ์˜ ๋ฏธ๋กœ ์ง€์  ์ž์ฒด๋ฅผ ๋ฐฉ๋ฌธ ์ง€์ ์œผ๋กœ์จ, ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


- ์ด์ œ BFS์˜ ๋™์ž‘ ๋ฐฉ์‹์€ ๋™์ผํ•œ๋‹ค. ๋‹จ, poll ํ•œ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ฐฉํ–ฅ ๋ฒกํ„ฐ for๋ฌธ์„ ๋Œ๋ ค, ๊ฐ๊ฐ ํƒ์ƒ‰์„ ์ด์–ด๋‚˜๊ฐ„๋‹ค.

- ๋ฒ”์œ„ ์ฒดํฌ๋„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

- ํƒ์ƒ‰์„ ์™„๋ฃŒํ•œ ์ง€์ ์€ +1์”ฉ ์ •๋‹ต ๋ฐฐ์—ด์— ๋”ํ•ด์ฃผ๋ฉฐ, queue์— ์‚ฝ์ž…ํ•œ๋‹ค.

 

 

 

BFS ๋ฌธ์ œ ์˜ˆ์‹œ 3

 

๋งˆ์ง€๋ง‰ BFS ๋ฌธ์ œ์ด๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ BFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์— ๋งŽ์€ ์ƒ๊ฐ์„ ํ•„์š”๋กœ ํ•œ๋‹ค.

 

 

1167๋ฒˆ: ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„

ํŠธ๋ฆฌ๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ํŠธ๋ฆฌ์˜ ์ •์ ์˜ ๊ฐœ์ˆ˜ V๊ฐ€ ์ฃผ์–ด์ง€๊ณ  (2 ≤ V ≤ 100,000)๋‘˜์งธ ์ค„๋ถ€ํ„ฐ V๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฐ„์„ ์˜ ์ •๋ณด๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค. ์ •์  ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ V๊นŒ์ง€

www.acmicpc.net

 

 

import java.util.*;
import java.io.*;
public class Main {

    static ArrayList<Edge>[] A;
    static int n, m;
    static boolean[] visited;
    static int[] distance;


    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        A = new ArrayList[n+1];

        for(int i=1; i<=n; i++) {
            A[i] = new ArrayList<Edge>();
        }
        for(int i=0; i<n; i++) {
            int S = sc.nextInt();
            while(true) {
                int E = sc.nextInt();
                if (E == -1) {
                    break;
                }
                int V = sc.nextInt();
                A[S].add(new Edge(E, V));
            }
        }
        distance = new int[n+1];
        visited = new boolean[n+1];
        BFS(1);
        int Max = 1;
        for(int i=2; i<=n; i++) {
            if (distance[Max] < distance[i]) {
                Max = i;
            }
        }


        distance = new int[n+1];
        visited = new boolean[n+1];
        BFS(Max);
        Arrays.sort(distance);
        System.out.println(distance[n]);
    }

    private static void BFS(int index) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(index);
        visited[index] = true;
        while(!queue.isEmpty()) {
            int now_node = queue.poll();
            for(Edge i : A[now_node]) {
                int e = i.e;
                int v = i.value;
                if(!visited[e]) {
                    visited[e] = true;
                    queue.add(e);
                    distance[e] = distance[now_node] + v;
                }
            }
        }
    }



}
class Edge {
    int e;
    int value;

    public Edge(int e, int value) {
        this.e = e;
        this.value = value;
    }
}

 

 

์ด ๋ฌธ์ œ๊ฐ€ ์–ด๋ ค์šด ์ด์œ ๋Š” ๊ฐ€์ค‘์น˜๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ๋„ ์žˆ๊ธด ํ•˜๋‹ค.

๊ทธ๋ž˜ํ”„์—์„œ ๋…ธ๋“œ์™€ ๋…ธ๋“œ ์‚ฌ์ด(์—์ง€)์— ๊ฐ€์ค‘์น˜๋ผ๋Š” ๊ฒƒ์ด ๋”ํ•ด์ง€๋ฉด, ๋‹ต์˜ ๊ธฐ์ค€์ด ๋ฐ”๋€Œ๊ณค ํ•œ๋‹ค.

 

์ž๋ฐ”์—์„œ๋Š” ์ด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค๋กœ ์—์ง€๋ฅผ ๋‘์–ด, ๋…ธ๋“œ์™€ ๊ฐ€์ค‘์น˜๋ฅผ ํ•œ ๋ฒˆ์— ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

 

- ArrayList์˜ ์ œ๋„ค๋ฆญ ํƒ€์ž…์€ Edge์ด๋‹ค.

- ์ž„์˜์˜ ๋…ธ๋“œ์—์„œ ๊ฐ€์žฅ ๊ธด ๊ฒฝ๋กœ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ๋Š” ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” ๋‘ ๋…ธ๋“œ ์ค‘์— ํ•˜๋‚˜์ด๋‹ค.

- ์ฆ‰, ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ด ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

- BFS๋Š” ๊ฒฐ๊ตญ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ํ•ด๋‹น ๋…ธ๋“œ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํƒ์ƒ‰ ๊ฑฐ๋ฆฌ(๊ฐ€์ค‘์น˜)๋ฅผ ๋”ํ•ด๊ฐ€๋ฉฐ, ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด์„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

- BFS๋ฅผ ๋‘ ๋ฒˆ ํ•˜๋Š” ์ด์œ ๋Š”, ์ฒซ ๋ฒˆ์งธ ์ž„์˜์˜ ๋…ธ๋“œ์—์„œ ์ฐพ์€ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•œ ๊ฑฐ๋ฆฌ ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฐ”๋กœ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” ๋‘ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜์ธ ๊ฒƒ์ด๊ณ ,

์ด ๋…ธ๋“œ์˜ BFS๋ฅผ ์ˆ˜ํ–‰ํ•จ์„ ํ†ตํ•ด, ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

BFS๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ,
ํƒ์ƒ‰ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ๋”ํ•ด ๊ฐ€๋ฉฐ, ์›ํ•˜๋Š” ํƒ์ƒ‰ ๋Œ€์ƒ๋„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 Reference

- Do it! ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ - ๊ธฐ์ดˆ ํŽธ