← SEARCHABLE ARCHIVE
Algorithm · 2026-07-08

BFS와 DFS의 차이

그래프를 넓게 탐색할까 깊게 탐색할까?

INTERACTIVE READING MODE →

본 블로그 작성 글들은, 강의를 목표로 하고 제작되었습니다. 또한 작성된 글의 정보도 틀렸을 수 있으니, 주의해주세요.

그래프를 탐색하는 대표적인 방법에는 BFS와 DFS가 있다. 둘 다 방문하지 않은 정점을 따라가지만 순서가 다르다.

BFS

Breadth-First Search는 시작점에서 가까운 정점부터 넓게 탐색한다. Queue를 사용한다.

std::queue<int> Open;
std::vector<bool> Visited(NodeCount, false);

Open.push(Start);
Visited[Start] = true;

while (!Open.empty())
{
    const int Current = Open.front();
    Open.pop();

    for (int Next : Graph[Current])
    {
        if (!Visited[Next])
        {
            Visited[Next] = true;
            Open.push(Next);
        }
    }
}

모든 간선 비용이 같다면 BFS로 시작점에서 가장 적은 간선 수의 경로를 찾을 수 있다.

DFS

Depth-First Search는 한 경로를 끝까지 내려간 뒤 돌아온다. 재귀 호출이나 Stack을 사용한다.

void DFS(int Current)
{
    Visited[Current] = true;

    for (int Next : Graph[Current])
    {
        if (!Visited[Next])
        {
            DFS(Next);
        }
    }
}

연결 요소, 사이클 탐지, 백트래킹 구조에 자주 사용한다. 그래프가 매우 깊으면 재귀 Stack이 넘칠 수 있으므로 명시적인 Stack 구현을 고려한다.

BFS가 무조건 좋거나 DFS가 무조건 빠른 것은 아니다. 가까운 답이 필요한지, 경로를 깊게 시험해야 하는지, 메모리와 그래프 깊이가 어떤지에 따라 선택한다.