15강 / 20강
BFS와 DFS — 넓게 퍼질까, 깊게 파고들까
큐 하나 vs 스택 하나, 그 한 글자 차이
그래프를 만들었으니 이제 돌아다녀야 합니다. 방법은 크게 둘이에요.
🌊 BFS · 너비 우선
연못에 돌을 던진 물결처럼가까운 곳부터 한 겹씩
큐(FIFO) 사용
✅ 최단 거리를 보장
🕳️ DFS · 깊이 우선
미로에서 한 길로 끝까지막히면 갈림길로 되돌아옴
스택(LIFO) 또는 재귀 사용
✅ 메모리를 적게 씀
놀라운 건, 두 코드가 거의 똑같다는 사실입니다.
꺼내는 자리를 popleft()로 하면 BFS, pop()으로 하면 DFS예요.
7강에서 배운 그 한 글자 차이가 알고리즘의 성격을 통째로 바꿉니다.
코드는 똑같고 popleft/pop 만 다릅니다. 실행해서 순서를 비교해 보세요.
Python
브라우저에서 실행
🎮 격자 위에서 퍼지는 모습 보기
격자에서 시작점을 정하고 BFS와 DFS를 각각 눌러 보세요. BFS는 동심원처럼 퍼지고, DFS는 한 방향으로 쭉 뻗어 나갑니다. 칸에 적히는 숫자는 몇 번째로 방문했는지입니다.
BFS의 특권 — 최단 거리
BFS는 가까운 곳을 반드시 먼저 방문합니다. 그래서 어떤 점에 처음 도달한 순간, 그게 최단 거리임이 보장돼요. DFS는 이 보장이 없습니다 — 운 나쁘면 멀리 돌아서 도착합니다.
'몇 다리 건너 아는 사이'를 BFS로 계산합니다.
Python
브라우저에서 실행
DFS는 재귀로 쓰면 더 짧습니다
9강에서 재귀 = 스택이라고 했죠. DFS는 스택을 쓰니까, 스택을 직접 만드는 대신 재귀에게 맡기면 코드가 훨씬 짧아집니다.
DFS를 재귀 다섯 줄로. 파이썬이 스택을 대신 관리해 줍니다.
Python
브라우저에서 실행
'서로 이어진 무리'를 세는 것도 탐색의 대표 응용입니다.
Python
브라우저에서 실행
🤔 확인 문제
BFS와 DFS 코드의 결정적 차이는?
해설
popleft()냐 pop()이냐 — 딱 한 곳만 다릅니다. 자료구조 선택이 알고리즘의 성격을 결정하는 가장 극적인 예예요.🤔 확인 문제
미로에서 최소 걸음 수를 구해야 합니다. 무엇을 써야 할까요?
해설 BFS는 거리 1인 칸 전부 → 거리 2인 칸 전부 → … 순으로 퍼집니다. 그래서 목표에 처음 닿은 순간이 최단이에요. DFS는 운 나쁘면 멀리 돌아서 도착합니다.
🤔 확인 문제
그래프 탐색에서
본곳 집합을 빠뜨리면?해설 A → B → A → B … 영원히 돕니다. 트리에는 순환이 없어서 필요 없었지만, 그래프에서는 필수예요.