15강 / 20강

BFS와 DFS — 넓게 퍼질까, 깊게 파고들까

큐 하나 vs 스택 하나, 그 한 글자 차이

BFS와 DFS — 넓게 퍼질까, 깊게 파고들까
물결처럼 퍼지는 BFS, 미로를 파고드는 DFS.

그래프를 만들었으니 이제 돌아다녀야 합니다. 방법은 크게 둘이에요.

🌊 BFS · 너비 우선
연못에 돌을 던진 물결처럼
가까운 곳부터 한 겹씩
큐(FIFO) 사용
✅ 최단 거리를 보장
🕳️ DFS · 깊이 우선
미로에서 한 길로 끝까지
막히면 갈림길로 되돌아옴
스택(LIFO) 또는 재귀 사용
✅ 메모리를 적게 씀

놀라운 건, 두 코드가 거의 똑같다는 사실입니다. 꺼내는 자리를 popleft()로 하면 BFS, pop()으로 하면 DFS예요. 7강에서 배운 그 한 글자 차이가 알고리즘의 성격을 통째로 바꿉니다.

코드는 똑같고 popleft/pop 만 다릅니다. 실행해서 순서를 비교해 보세요.
Python 브라우저에서 실행

🎮 격자 위에서 퍼지는 모습 보기

격자에서 시작점을 정하고 BFS와 DFS를 각각 눌러 보세요. BFS는 동심원처럼 퍼지고, DFS는 한 방향으로 쭉 뻗어 나갑니다. 칸에 적히는 숫자는 몇 번째로 방문했는지입니다.

BFS vs DFS — 격자 위에서 퍼지는 모양을 애니메이션으로 비교
불러오는 중…

BFS의 특권 — 최단 거리

BFS는 가까운 곳을 반드시 먼저 방문합니다. 그래서 어떤 점에 처음 도달한 순간, 그게 최단 거리임이 보장돼요. DFS는 이 보장이 없습니다 — 운 나쁘면 멀리 돌아서 도착합니다.

'몇 다리 건너 아는 사이'를 BFS로 계산합니다.
Python 브라우저에서 실행

DFS는 재귀로 쓰면 더 짧습니다

9강에서 재귀 = 스택이라고 했죠. DFS는 스택을 쓰니까, 스택을 직접 만드는 대신 재귀에게 맡기면 코드가 훨씬 짧아집니다.

DFS를 재귀 다섯 줄로. 파이썬이 스택을 대신 관리해 줍니다.
Python 브라우저에서 실행
'서로 이어진 무리'를 세는 것도 탐색의 대표 응용입니다.
Python 브라우저에서 실행
🤔 확인 문제
BFS와 DFS 코드의 결정적 차이는?
🤔 확인 문제
미로에서 최소 걸음 수를 구해야 합니다. 무엇을 써야 할까요?
🤔 확인 문제
그래프 탐색에서 본곳 집합을 빠뜨리면?