[μ•Œκ³ λ¦¬μ¦˜] DFS & BFS πŸ”—

ChoΒ·2023λ…„ 12μ›” 4일
post-thumbnail

μ•ˆλ…•ν•˜μ„Έμš”.
μ˜€λŠ˜μ€ DFS와 BFS에 λŒ€ν•΄ μ•Œμ•„λ³΄κ³ , 이에 κ΄€λ ¨λœ κ°„λ‹¨ν•œ 문제λ₯Ό 풀이해 볼까 ν•©λ‹ˆλ‹€.

DFS & BFS

λ¨Όμ € DFS와 BFS의 λœ»μ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

DFSλŠ” Depth-First Search, 깊이 μš°μ„  νƒμƒ‰μ΄λΌλŠ” 의미λ₯Ό κ°–κ³  있고, BFSλŠ” Breadth-First Search, λ„ˆλΉ„ μš°μ„  νƒμƒ‰μ΄λΌλŠ” 의미λ₯Ό κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ κΉŠμ΄μ™€ λ„ˆλΉ„λΌλŠ” 것을 μ•ŒκΈ° μœ„ν•΄μ„œλŠ” 무엇을 νƒμƒ‰ν•˜λŠ”μ§€ μ•Œμ•„μ•Ό ν•˜λŠ”λ°μš”,
주둜 이 탐색 μ•Œκ³ λ¦¬μ¦˜μ€ κ·Έλž˜ν”„ ν˜Ήμ€ 트리λ₯Ό νƒμƒ‰ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ κ·Έλž˜ν”„μ™€ νŠΈλ¦¬λŠ” μ•„λž˜μ™€ 같은 차이점이 μžˆμŠ΅λ‹ˆλ‹€.

그럼 μ—¬κΈ°μ„œ 탐색 μ•Œκ³ λ¦¬μ¦˜μ˜ κΉŠμ΄μ™€ λ„ˆλΉ„λŠ” κ·Έλž˜ν”„λ‚˜ 트리의 κΉŠμ΄λ‚˜ λ„ˆλΉ„λ₯Ό μ˜λ―Έν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

DFS: 깊이 μš°μ„  탐색

μ΅œλŒ€ν•œ 깊게 λ‚΄λ €κ°„ λ’€ λŒ€λ €κ°ˆ 갈 곳이 없을 경우 μ˜†μœΌλ‘œ μ΄λ™ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ μž…λ‹ˆλ‹€.

μˆœμ„œλ₯Ό μ‹œκ°ν™” ν•˜λ©΄ μœ„μ™€ 같은 μˆœμ„œλŒ€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
그림을 보면 트리의 깊이 λκΉŒμ§€ λ‚΄λ €κ°”λ‹€κ°€ 더이상 갈 κΉŠμ΄κ°€ μ—†μ„λ•Œ λ‹€μŒ λΆ„κΈ°λ‘œ λ„˜μ–΄κ°€λŠ” λͺ¨μŠ΅μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

DFSλŠ” μƒλŒ€μ μœΌλ‘œ BFS보닀 κ΅¬ν˜„μ΄ κ°„λ‹¨ν•˜μ§€λ§Œ, 검색속도 μžμ²΄λŠ” BFS보닀 λŠλ¦¬λ‹€λŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

μŠ€νƒμ΄λ‚˜ μ œκ·€ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

BFS: λ„ˆλΉ„ μš°μ„  탐색

μ΅œλŒ€ν•œ λ„“κ²Œ μ΄λ™ν•œ λ‹€μŒ, 더이상 갈 수 없을 λ•Œ μ•„λž˜λ‘œ μ΄λ™ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ μž…λ‹ˆλ‹€.

μ‹œμž‘ν•˜λŠ” μ •μ μ—μ„œ μΈμ ‘ν•œ κ³³ λ¨Όμ € νƒμƒ‰ν•˜λŠ” λ°©λ²•μœΌλ‘œ, κ°€μž₯ κ°€κΉŒμš΄ 정점을 λ¨Όμ € λ°©λ¬Έν•˜κ³  멀리 λ–¨μ–΄μ Έ μžˆλŠ” 정점을 λ‚˜μ€‘μ— μˆœνšŒν•˜λŠ” 방법 μž…λ‹ˆλ‹€.

μΈμ ‘ν•œ 정점을 λ¨Όμ € νƒμƒ‰ν•˜λ―€λ‘œ μ΅œλ‹¨ κ²½λ‘œκ°€ 보μž₯λ©λ‹ˆλ‹€.

큐둜 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

문제 풀이

DFS와 BFS

μœ„ λ¬Έμ œλŠ” DFS와 BFSλ₯Ό λ™μ‹œμ— κ΅¬ν˜„ν•˜λŠ” λ¬Έμ œμΈλ°μš”, λ‘˜μ„ λ™μ‹œμ— κ΅¬ν˜„ν•˜κΈ° 쒋은 λ¬Έμ œμž…λ‹ˆλ‹€.

μ €λŠ” DFSλ₯Ό μ œκ·€λ‘œ, BFSλ₯Ό 큐λ₯Ό μ‚¬μš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

vector<bool> dfsVisit(1001);
vector<bool> bfsVisit(1001);
vector<vector<int>> map(1001);

void dfs(int index) {
    cout << index << " ";
    for(int child: map[index]) {
        if (!dfsVisit[child]) {
            dfsVisit[child] = true;
            dfs(child);
        }
    }
}

int main() {
    int n, m, start;
    cin >> n >> m >> start;
    for (int i = 0; i < m; ++i) {
        int p, c;
        cin >> p >> c;
        map[p].push_back(c);
        map[c].push_back(p);
    }
    for (int i = 1; i < map.size(); i++) {
        sort(map[i].begin(), map[i].end());
    }
    dfsVisit[start] = true;
    dfs(start);
    cout << "\n";

    queue<int> Q;
    Q.push(start);
    bfsVisit[start] = true;
    while (!Q.empty()) {
        int select = Q.front();
        Q.pop();
        cout << select << " ";
        vector<int> input;
        for (int child: map[select]) {
            if (bfsVisit[child]) continue;
            bfsVisit[child] = true;
            Q.push(child);
        }
    }
}

마무리

μ˜€λŠ˜μ€ 탐색 μ•Œκ³ λ¦¬μ¦˜ DFS와 BFS에 λŒ€ν•΄ μ„€λͺ…ν•΄ λ“œλ ΈμŠ΅λ‹ˆλ‹€.
처음 μ ‘ν•˜λ©΄ μ–΄λ €μš΄ μ•Œκ³ λ¦¬μ¦˜ 이지면 μ΅μˆ™ν•΄μ§€λ©΄ μ–΄λŠ μ•Œκ³ λ¦¬μ¦˜λ³΄λ‹€ κ°„λ‹¨ν•œ μ•Œκ³ λ¦¬μ¦˜ 인것 κ°™μŠ΅λ‹ˆλ‹€..γ…‹γ…‹

μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

profile
κΈ°λ‘ν•˜λŠ” 개발자

0개의 λŒ“κΈ€