[TIL] 2024-12-12_BFS/DFS

YuriΒ·2024λ…„ 12μ›” 12일

TIL

λͺ©λ‘ 보기
6/59
post-thumbnail

πŸ“• Today I Learned - 였늘 λ‚΄κ°€ κ³΅λΆ€ν•œ 것을 μ •λ¦¬ν•©λ‹ˆλ‹€.

1. BFS

BFS (Breadth-first-Search, λ„ˆλΉ„ μš°μ„  탐색)

  • 루트 λ…Έλ“œ(ν˜Ήμ€ μž„μ˜μ˜ λ‹€λ₯Έ λ…Έλ“œ)μ—μ„œλΆ€ν„° μ‹œμž‘ν•˜μ—¬ μΈμ ‘ν•œ λ…Έλ“œλ₯Ό λ¨Όμ € 탐색해 λ‚˜κ°€λŠ” 방법
  • κ·Έλž˜ν”„μ—μ„œ μ΅œλ‹¨ 경둜λ₯Ό μ°ΎλŠ” 정점 기반 μ•Œκ³ λ¦¬μ¦˜

μœ„μ™€ 같은 κ·Έλž˜ν”„κ°€ μ‘΄μž¬ν•˜κ³  λ…Έλ“œμ˜ 탐색을 1번 λΆ€ν„° μ‹œμž‘.

  • BFS μ•Œκ³ λ¦¬μ¦˜ κ·Έλž˜ν”„ 탐색 μˆœμ„œ
    • 1 -> 2 -> 3 -> 8 -> 6 -> 5 -> 4 -> 7
package Algorithm;

import java.util.LinkedList;
import java.util.Queue;

public class Bfs {

    public static void main(String[] args) {
        // κ·Έλž˜ν”„λ₯Ό 2차원 λ°°μ—΄λ‘œ ν‘œν˜„
        // λ°°μ—΄μ˜ 인덱슀λ₯Ό λ…Έλ“œμ™€ λ§€μΉ­μ‹œμΌœμ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 인덱슀 0은 아무것도 μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.
        // 1번 μΈλ±μŠ€λŠ” 1번 λ…Έλ“œλ₯Ό λœ»ν•˜κ³  λ…Έλ“œμ˜ λ°°μ—΄μ˜ 값은 μ—°κ²°λœ λ…Έλ“œλ₯Ό λœ»ν•¨.
        int[][] graph = {{}, {2, 3, 8}, {1, 6, 8}, {1, 5}, {5, 7}, {3, 4, 7}, {2}, {4, 5}, {1, 2}};

        // λ°©λ¬Έ 처리λ₯Ό μœ„ν•œ boolean λ°°μ—΄ μ„ μ–Έ
        boolean[] visited = new boolean[graph.length];

        System.out.println(bfs(1, graph, visited));
    }

    public static String bfs(int start, int[][] graph, boolean[] visited) {
        // 탐색 μˆœμ„œλ₯Ό 좜λ ₯ν•˜κΈ° μœ„ν•œ μš©λ„
        StringBuilder sb = new StringBuilder();
        // BFS에 μ‚¬μš©ν•  큐λ₯Ό 생성
        Queue<Integer> queue = new LinkedList<>();

        // 큐에 BFSλ₯Ό μ‹œμž‘ ν•  λ…Έλ“œ 번호λ₯Ό λ„£κΈ°
        queue.offer(start);
        // μ‹œμž‘λ…Έλ“œ 방문처리
        visited[start] = true;

        // 큐가 빌 λ•ŒκΉŒμ§€ 반볡
        while (!queue.isEmpty()) {
            int nodeIndex = queue.poll();
            sb.append(nodeIndex + " -> "); // λ…Έλ“œ μˆœμ„œ
            // νμ—μ„œ κΊΌλ‚Έ λ…Έλ“œμ™€ μ—°κ²°λœ λ…Έλ“œλ“€ 체크
            for (int i = 0; i < graph[nodeIndex].length; i++) {
                int temp = graph[nodeIndex][i];
                // λ°©λ¬Έν•˜μ§€ μ•Šμ•˜μœΌλ©΄ 방문처리 ν›„ 큐에 λ„£κΈ°
                if (!visited[temp]) {
                    visited[temp] = true;
                    queue.offer(temp);
                }
            }
        }
        // 탐색 μˆœμ„œ 리턴
        sb = sb.delete(sb.length() - 3, sb.length()); // λ§ˆμ§€λ§‰ -> 제거
        return sb.toString();
    }

}

2. DFS

DFS (Depth-first Search, 깊이 μš°μ„  탐색)

  • 루트 λ…Έλ“œ(ν˜Ήμ€ μž„μ˜μ˜ λ‹€λ₯Έ λ…Έλ“œ)μ—μ„œλΆ€ν„° μ‹œμž‘ν•˜μ—¬ λ‹€μŒ λΆ„κΈ°λ‘œ λ„˜μ–΄κ°€κΈ° μ „ ν•΄λ‹Ή λΆ„κΈ°λ₯Ό μ™„λ²½ν•˜κ²Œ νƒμƒ‰ν•˜λŠ” 방식
  • ν•˜λ‚˜μ˜ μˆœν™˜ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ λ°±νŠΈλž˜ν‚Ήμ— μ‚¬μš©ν•˜λŠ” λŒ€ν‘œμ μΈ 탐색 μ•Œκ³ λ¦¬μ¦˜


μœ„μ™€ 같은 κ·Έλž˜ν”„κ°€ μ‘΄μž¬ν•˜κ³  λ…Έλ“œμ˜ 탐색을 1번 λΆ€ν„° μ‹œμž‘.

  • DFS μ•Œκ³ λ¦¬μ¦˜ κ·Έλž˜ν”„ 탐색 μˆœμ„œ
    • 1 -> 2 -> 6 -> 8 -> 3 -> 5 -> 4 -> 7

μž₯점

  • ν˜„μž¬ κ²½λ‘œμƒμ˜ λ…Έλ“œλ“€λ§Œ κΈ°μ–΅ν•˜λ©΄ λ˜λ―€λ‘œ μ €μž₯곡간이 비ꡐ적 적게 λ“ λ‹€.
  • 깊이 μš°μ„  탐색이 λ„ˆλΉ„ μš°μ„  탐색 보닀 μ’€ 더 κ°„λ‹¨ν•˜λ‹€.
  • λͺ©ν‘œλ…Έλ“œκ°€ κΉŠμ€ 단계에 μžˆμ„ 경우 ν•΄λ₯Ό 빨리 ꡬ할 수 μžˆλ‹€.

경둜의 νŠΉμ§•μ„ μ €μž₯해둬야 ν•˜λŠ” λ¬Έμ œλ‚˜ 검색 λŒ€μƒ κ·Έλž˜ν”„ 문제 등에 μ‚¬μš©

package Algorithm;

public class Dfs {
    // κ·Έλž˜ν”„λ₯Ό 2차원 λ°°μ—΄λ‘œ ν‘œν˜„
    // λ°°μ—΄μ˜ 인덱슀λ₯Ό λ…Έλ“œμ™€ λ§€μΉ­μ‹œμΌœμ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 인덱슀 0은 아무것도 μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.
    // 1번 μΈλ±μŠ€λŠ” 1번 λ…Έλ“œλ₯Ό λœ»ν•˜κ³  λ…Έλ“œμ˜ λ°°μ—΄μ˜ 값은 μ—°κ²°λœ λ…Έλ“œλ₯Ό λœ»ν•¨.
    static int[][] graph = {{}, {2, 3, 8}, {1, 6, 8}, {1, 5}, {5, 7}, {3, 4, 7}, {2}, {4, 5}, {1, 2}};
    static boolean[] visited = new boolean[graph.length];
    static int count;

    public static void main(String[] args) {
        dfs(1);
    }

    static void dfs(int nodeIndex) {
        // 방문 처리
        visited[nodeIndex] = true;
        count++;

        // λ°©λ¬Έ λ…Έλ“œ 좜λ ₯
        System.out.print(nodeIndex);
        if (count != graph.length - 1) {
            System.out.print(" -> "); // λ§ˆμ§€λ§‰ -> 좜λ ₯ν•˜μ§€ μ•ŠμŒ
        }

        // λ°©λ¬Έν•œ λ…Έλ“œμ— μΈμ ‘ν•œ λ…Έλ“œ μ°ΎκΈ°
        for (int node : graph[nodeIndex]) {
            // μΈμ ‘ν•œ λ…Έλ“œκ°€ λ°©λ¬Έν•œ 적이 μ—†λ‹€λ©΄ DFS μˆ˜ν–‰
            if (!visited[node]) {
                dfs(node); // μž¬κ·€
            }
        }
    }
}

μ‚¬μš©ν•˜λŠ” 경우
두 λ…Έλ“œ μ‚¬μ΄μ˜ μ΅œλ‹¨ 경둜 ν˜Ήμ€ μž„μ˜μ˜ 경둜λ₯Ό μ°Ύκ³  싢을 λ•Œ 선택

  • 깊이 μš°μ„  탐색(DFS) : λͺ¨λ“  관계λ₯Ό λ‹€ 탐색
  • λ„ˆλΉ„ μš°μ„  탐색(BFS) : κ°€κΉŒμš΄ 관계뢀터 탐색

λ„ˆλΉ„ μš°μ„  탐색(BFS)이 깊이 μš°μ„  탐색(DFS)보닀 더 λ³΅μž‘ν•˜λ‹€.

πŸ”— 참고자료
https://codingnojam.tistory.com/41
https://codingnojam.tistory.com/44


πŸ’­ μžλ°”λ‘œ λ‚˜λ§Œμ˜ μ•Œκ³ λ¦¬μ¦˜ λ…ΈνŠΈ λ§Œλ“€κΈ°

profile
μ•ˆλ…•ν•˜μ„Έμš” :)

0개의 λŒ“κΈ€