3 ๋ถ„ ์†Œ์š”

๐Ÿ“š ALGORITHM


๐Ÿ“š BFS & DFS

BFS ( Breadth First Search )์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ?


๋ฃจํŠธ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“ค๋“ค์„ ๋จผ์ € ๋ชจ๋‘ ์ฐจ๋ก€๋กœ ๋ฐฉ๋ฌธํ•œ ํ›„์—, ๋ฐฉ๋ฌธํ–ˆ๋˜ ์ž์‹ ๋…ธ๋“œ๋“ค์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜์—ฌ ๋‹ค์‹œ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์„ ์ฐจ๋ก€๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
์ตœ๋Œ€ํ•œ ๋„“๊ฒŒ ์ด๋™ํ•œ ๋‹ค์Œ, ๋” ์ด์ƒ ๊ฐˆ ์ˆ˜ ์—†์„ ๋•Œ ์•„๋ž˜๋กœ ์ด๋™ํ•œ๋‹ค.
๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋ผ ํ•œ๋‹ค.

์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•ด ํƒ์ƒ‰์„ ํ•œ ํ›„, ์ฐจ๋ก€๋กœ ๋‹ค์‹œ ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ
์„ ์ž…์„ ์ถœ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ธ ํ๋ฅผ ํ™œ์šฉํ•œ๋‹ค !!

BFS๋ฅผ ํ™œ์šฉํ•œ ๋ฌธ์ œ ์œ ํ˜•

  • ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ์ •์ ์„ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์ด ์ฃผ์š”ํ•œ ๋ฌธ์ œ
  • ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ
  • ๊ฒ€์ƒ‰ ๋Œ€์ƒ์˜ ๊ทœ๋ชจ๊ฐ€ ํฌ์ง€ ์•Š๊ณ , ๊ฒ€์ƒ‰ ์‹œ์ž‘ ์‹œ์ ์œผ๋กœ๋ถ€ํ„ฐ ์›ํ•˜๋Š” ๋Œ€์ƒ์ด ๋ณ„๋กœ ๋ฉ€์ง€ ์•Š์€ ๊ฒฝ์šฐ

BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ๋ฅผ ์‚ฌ์šฉํ•ด ๋…ธ๋“œ๋“ค์„ ์‚ฝ์ž…, ๋ฐ˜ํ™˜ ํ•˜๊ณ 
boolean์„ ์ด์šฉํ•ด ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ์ธ์ง€ ์•„๋‹Œ์ง€ ํŒ๋‹จํ•œ๋‹ค.

  1. ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…
  2. while๋ฌธ ์ƒ์„ฑ ( ์ข…๋ฃŒ ์กฐ๊ฑด : ํ๊ฐ€ ๋น„์–ด ์žˆ์„ ๊ฒฝ์šฐ )
  3. x <- ํ์˜ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ ๋ฐ˜ํ™˜ ( offer )
  4. x ์‹คํ–‰ ( ๋ฌธ์ œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฆ„ )
  5. x์˜ ์ž์‹๋…ธ๋“œ๋“ค ํ์— ์‚ฝ์ž… ( push )
  6. while๋ฌธ ๋ฐ˜๋ณต

BFS ์‹ค์Šต ํ•ด๋ณด์ฆˆ์•„ !

import java.util.*;

public class Main {

    public static boolean[] visited = new boolean[9];
    public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();

    // BFS ํ•จ์ˆ˜ ์ •์˜
    public static void bfs(int start) {
        Queue<Integer> q = new LinkedList<>();
        q.offer(start);
        // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        visited[start] = true;
        // ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while(!q.isEmpty()) {
            // ํ์—์„œ ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ๋ฝ‘์•„ ์ถœ๋ ฅ
            int x = q.poll();
            System.out.print(x + " ");
            // ํ•ด๋‹น ์›์†Œ์™€ ์—ฐ๊ฒฐ๋œ, ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์›์†Œ๋“ค์„ ํ์— ์‚ฝ์ž…
            for(int i = 0; i < graph.get(x).size(); i++) {
                int y = graph.get(x).get(i);
                if(!visited[y]) {
                    q.offer(y);
                    visited[y] = true;
                }
            }
        }
    }

    public static void main(String[] args) {
        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        for (int i = 0; i < 9; i++) {
            graph.add(new ArrayList<Integer>());
        }

        // ๋…ธ๋“œ 1์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(1).add(2);
        graph.get(1).add(3);
        graph.get(1).add(8);

        // ๋…ธ๋“œ 2์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(2).add(1);
        graph.get(2).add(7);

        // ๋…ธ๋“œ 3์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(3).add(1);
        graph.get(3).add(4);
        graph.get(3).add(5);

        // ๋…ธ๋“œ 4์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(4).add(3);
        graph.get(4).add(5);

        // ๋…ธ๋“œ 5์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(5).add(3);
        graph.get(5).add(4);

        // ๋…ธ๋“œ 6์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(6).add(7);

        // ๋…ธ๋“œ 7์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(7).add(2);
        graph.get(7).add(6);
        graph.get(7).add(8);

        // ๋…ธ๋“œ 8์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(8).add(1);
        graph.get(8).add(7);

        bfs(1);
    }
}

์ถœ๋ ฅ ๊ฒฐ๊ณผ

1 2 3 8 7 4 5 6

DFS์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ?


๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” ๊ณณ๊นŒ์ง€ ๊นŠ์ด ํƒ์ƒ‰ํ•ด ๊ฐ€๋‹ค๊ฐ€ ๋” ์ด์ƒ ๊ฐˆ ๊ณณ์ด ์—†๊ฒŒ ๋˜๋ฉด, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋งŒ๋‚ฌ๋˜ ๊ฐˆ๋ฆผ๊ธธ ๊ฐ„์„ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋กœ ๋˜๋Œ์•„์™€์„œ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์˜ ๋…ธ๋“œ๋กœ ํƒ์ƒ‰์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ฒฐ๊ตญ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœํšŒ๋ฐฉ๋ฒ•์ด๋‹ค.
์ตœ๋Œ€ํ•œ ๊นŠ์ด ๋‚ด๋ ค๊ฐ„ ๋’ค, ๋”์ด์ƒ ๊นŠ์ด ๊ฐˆ ๊ณณ์ด ์—†์„ ๊ฒฝ์šฐ ์˜†์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ ํ•œ๋‹ค.

๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋งŒ๋‚ฌ๋˜ ๊ฐˆ๋ฆผ๊ธธ์˜ ๋…ธ๋“œ๋กœ ๋˜๋Œ์•„๊ฐ€์„œ ๋‹ค์‹œ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ํ›„์ž…์„ ์ถœ ๊ตฌ์กฐ์˜ ์Šคํƒ์„ ํ™œ์šฉํ•œ๋‹ค !!
์ผ๋ฐ˜์ ์œผ๋กœ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋ณดํŽธ์ ์ด๋กœ ์งง์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ์ค‘๋‹จ๋˜๋Š” ์กฐ๊ฑด์ธ ๊ธฐ์ €์กฐ๊ฑด์„ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.

DFS๋ฅผ ํ™œ์šฉํ•œ ๋ฌธ์ œ ์œ ํ˜•

  • ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ์ •์ ์„ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์ด ์ฃผ์š”ํ•œ ๋ฌธ์ œ
  • ๊ฒฝ๋กœ์˜ ํŠน์ง•์„ ์ €์žฅํ•ด๋‘ฌ์•ผ ํ•˜๋Š” ๋ฌธ์ œ
  • ๊ฒ€์ƒ‰ ๋Œ€์ƒ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ •๋ง ํฌ๋‹ค๋ฉด DFS๋ฅผ ๊ณ ๋ ค

DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ฐ€์žฅ ๋ณดํŽธ์ ์ธ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์‹ค์Šตํ•ด ๋ณด๊ฒ ๋‹ค.

  1. ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ
  2. for๋ฌธ์„ ํ†ตํ•ด ๋ชจ๋“  ์ž์‹๋…ธ๋“œ ํƒ์ƒ‰
  3. for๋ฌธ ์•ˆ์—์„œ ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ
  4. ๋ฐ˜๋ณต
  5. ๊ธฐ์ €์กฐ๊ฑด ๋งŒ๋‚˜๋ฉด return
  6. ์ž์‹๋…ธ๋“œ๊ฐ”๋‹ค๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ”๋‹ค๊ฐ€ ๋ฐ˜๋ณต -> ์ „์ฒด ํƒ์ƒ‰

DFS ์‹ค์Šต ํ•ด๋ณด์ฆˆ์•„ !

import java.util.*;

public class Main {

    public static boolean[] visited = new boolean[9];
    public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();

    // DFS ํ•จ์ˆ˜ ์ •์˜
    public static void dfs(int x) {
        // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        visited[x] = true;
        System.out.print(x + " ");
        // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
        for (int i = 0; i < graph.get(x).size(); i++) {
            int y = graph.get(x).get(i);
            if (!visited[y]) dfs(y);
        }
    }

    public static void main(String[] args) {
        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        for (int i = 0; i < 9; i++) {
            graph.add(new ArrayList<Integer>());
        }

        // ๋…ธ๋“œ 1์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(1).add(2);
        graph.get(1).add(3);
        graph.get(1).add(8);

        // ๋…ธ๋“œ 2์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(2).add(1);
        graph.get(2).add(7);

        // ๋…ธ๋“œ 3์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(3).add(1);
        graph.get(3).add(4);
        graph.get(3).add(5);

        // ๋…ธ๋“œ 4์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(4).add(3);
        graph.get(4).add(5);

        // ๋…ธ๋“œ 5์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(5).add(3);
        graph.get(5).add(4);

        // ๋…ธ๋“œ 6์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(6).add(7);

        // ๋…ธ๋“œ 7์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(7).add(2);
        graph.get(7).add(6);
        graph.get(7).add(8);

        // ๋…ธ๋“œ 8์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(8).add(1);
        graph.get(8).add(7);

        dfs(1);
    }
}

์ถœ๋ ฅ ๊ฒฐ๊ณผ

1 2 7 6 8 3 4 5





๐Ÿ‘ ์ฐธ์กฐ
https://devuna.tistory.com/32
https://freedeveloper.tistory.com/273