노트

깊이 우선 탐색 (DFS)

Depth-First Search

CS#algorithm · 연결된 개념 5개

쉽게 말하면

DFS는 미로에서 한 길을 막다른 곳까지 쭉 들어갔다가, 막히면 마지막 갈림길로 되돌아와 다른 길로 가는 탐색이에요. 지나간 곳에 분필로 표시해 두니 같은 길을 두 번 헤매지 않아요.

비유가 깨지는 곳 미로에서 처음 찾은 출구가 가장 가까운 출구라는 보장은 없어요. 간선 수 기준 최단 경로가 필요하면 BFS를 쓰고, 재귀로 너무 깊이 들어가면 콜 스택이 넘칠 수 있어요.

그래프에서 한 갈래를 갈 수 있는 데까지 깊이 들어갔다가, 막히면 되돌아와(백트래킹, Backtracking) 다른 갈래로 가는 탐색. 방문한 정점은 기록해 다시 가지 않는다.

function dfs(graph: Record<string, string[]>, start: string) {
  const visited = new Set<string>()
  const order: string[] = []
  const visit = (v: string) => {
    visited.add(v)
    order.push(v)
    for (const next of graph[v]) if (!visited.has(next)) visit(next)
  }
  visit(start)
  return order
}
  • 재귀로 쓰면 짧다. 그래프가 깊으면 콜 스택이 넘칠 수 있어, 명시적 스택에 넣고 빼는 반복문으로 바꿀 수 있다. 두 방식은 이웃을 넣는 순서 때문에 방문 순서가 다를 수 있다
  • 시간 O(V + E), 메모리는 경로 깊이만큼
  • 쓰임: 경로가 있는지, 연결된 덩어리가 몇 개인지, 순환이 있는지 확인. 위상 정렬(Topological Sort), 미로 풀이, 퍼즐의 모든 경우 탐색(백트래킹)

최단 경로(간선 수 기준)를 찾을 때는 DFS가 아니라 너비 우선 탐색 (BFS)를 쓴다. 트리에서의 깊이 우선 순회(전위·중위·후위)는 트리 순회, 그래프 표현은 그래프.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 다익스트라 알고리즘

    간선에 음수가 아닌 가중치(거리·비용·시간)가 있는 그래프에서, 한 정점으로부터 다른 모든 정점까지의 최단 경로를 구하는 알고리즘. 에츠허르 데이크스트라(Edsger W. Dijkstra)가 1956년에 고안했다. 지도 길찾기와 네트워크 라우팅의 바탕이다.

  • 이진 탐색 트리

    각 노드가 자식을 최대 둘 가지고, 왼쪽 서브트리의 모든 값은 노드보다 작고 오른쪽은 크다는 규칙을 지키는 트리. 비교할 때마다 한쪽 가지를 버리므로 정렬된 데이터를 빠르게 찾고 넣을 수 있다.

  • 빅오 표기법

    입력 크기 n이 커질 때 알고리즘의 실행 시간(시간 복잡도, Time Complexity)이나 메모리(공간 복잡도, Space Complexity)가 얼마나 빨리 늘어나는지를 대략적으로 나타내는 표기. 정확한 횟수가 아니라 증가하는 모양을 본다. 그래서 상수와 작은 항은 버린다(2n + 5는 O(n)).

  • 이진 탐색

    정렬된 배열에서 가운데 값과 찾는 값을 비교해 매번 절반을 버리며 찾는 방법. 원소가 100만 개여도 20번 남짓이면 끝난다(O(log n)). 처음부터 하나씩 확인하는 선형 탐색(Linear Search)은 O(n)이다.

  • 해시 테이블

    키를 해시 함수(Hash Function)로 배열 인덱스로 바꿔 값을 저장하는 자료구조. 조회·추가·삭제가 평균 O(1)이다. JavaScript의 객체와 Map·Set, 파이썬의 dict·set(python-collections), 자바의 HashMap이 모두 해시 테이블이다.

보기 옵션