포스트

DFS와 BFS 소개

DFS와 BFS가 무엇인지 알아보자

DFS와 BFS 소개

한 경로를 끝까지 탐색한 후, 다시 돌아와서 다른 경로를 탐색하는 방식이다. 스택(재귀)을 사용해 구현한다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
vector<int> g[1001]; // 벡터 배열
bool visited[1001]; // 방문한 노드 체크

void dfs(int s) { // 1. 시작 노드 방문
    visited[s] = true; // 2. 방문한 노드를 체크
    cout << s << " ";
    for (int idx : g[s]) {
        // 3. 인접한 노드를 재귀적으로 방문
        // 4. 더 이상 갈 곳이 없으면 이전 노드로
        if (!visited[idx])
            dfs(idx);
    }
}

동작 방식

  1. 시작 노드부터 방문하면서 출력
  2. 방문한 노드는 visited 배열에 체크
  3. 인접한 노드를 재귀적으로 방문
  4. 더 이상 갈 곳이 없으면 이전 노드로 되돌아감

사용 사례

미로 탐색, 사이클 탐지, 백트래킹 등

시작 노드에서 가까운 노드부터 탐색하는 방식이다. 큐를 사용해 구현한다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vector<int> g[1001]; // 벡터 배열
bool visited[1001]; // 방문한 노드 체크

void bfs(int s) {
    queue<int> q;
    q.push(s);        // 1. 시작 노드를 큐에 추가
    visited[s] = true; // 시작 노드 방문 처리

    while (!q.empty()) { // 4. 큐가 빌 때까지 반복
        int temp = q.front();
        q.pop();       // 2. 큐에서 노드를 꺼냄
        cout << temp << " ";

        for (int i : g[temp]) {
            if (!visited[i]) {
                q.push(i); // 3. 인접한 노드를 큐에 넣고 방문 
                visited[i] = true;
            }
        }
    }
}

동작 방식

  1. 시작 노드를 큐에 넣고 방문 체크
  2. 큐에서 노드를 꺼내면서 출력
  3. 인접한 노드를 큐에 넣고 방문 체크
  4. 큐가 빌 때까지 반복

DFS와 BFS의 차이점

알고리즘자료구조사용 사례
DFS스택(재귀)미로 탐색, 그래프 탐색
BFS최단 거리 문제, 네트워크 탐색
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.