🌀알고리즘🌀
[알고리즘] 그래프 탐색(DFS, BFS)
bbooyaaa
2025. 5. 23. 20:36
정의
그래프(graph)란 정점(Node)과 간선(Edge)으로 이루어진 자료구조이며, 이 안에서 특정 노드를 방문하는 순서를 정의하고 구현하는 알고리즘을 그래프 탐색(graph traversal)이라고 합니다.
DFS(깊이 우선 탐색): 한 노드를 깊이(끝)까지 계속 탐색한 후, 더 이상 갈 곳이 없으면 되돌아가서 다른 경로를 탐색하는 방식
- 갈 수 있는 곳까지 계속 깊이 들어감
- 막히면 되돌아와서 다른 방향을 탐색
- 보통 재귀함수로 구현
fun dfs(graph: Array<MutableList<Int>>, visited: BooleanArray, v: Int) {
visited[v] = true
println("방문: $v") // 현재 노드 출력
for (i in graph[v]) { // 현재 노드에 연결된 노드들 중
if (!visited[i]) { // 아직 방문하지 않은 노드만
dfs(graph, visited, i) // 재귀 호출
}
}
}
BFS(너비 우선 탐색): 한 노드에서 시작해서 가까운 노드부터 차례로 탐색하는 방식 (즉, 레벨 순으로 탐색)
- 시작 노드에서 가까운 노트부터 차례로 방문
- 즉, "레벨별로" 넓게 탐색
- 최단 거리 문제에 매우 유리함
import java.util.*
fun bfs(graph: Array<MutableList<Int>>, visited: BooleanArray, start: Int) {
val queue: Queue<Int> = LinkedList()
queue.add(start)
visited[start] = true
while (queue.isNotEmpty()) {
val v = queue.poll()
println("방문: $v")
for (i in graph[v]) {
if (!visited[i]) {
queue.add(i)
visited[i] = true
}
}
}
}
DFS와 BFS 개념 비교
| DFS(Depth - First Search) | BFS(Breadth-First Search) | |
| 접근 방식 | 깊이 우선 (먼저 끝까지 내려감) | 너비 우선 (가까운 노드부터 탐색) |
| 자료구조 | 스택(Stack) (보통은 재귀로 구현) | 큐(Queue) |
| 구현 방식 | 재귀 또는 명시적 스택 사용 | 큐를 이용한 반복문 |
| 경로 탐색 | 경로를 추적하기 쉬움 (백트래킹) | 최단 경로 문제에 유리함 |
따라서
- 모든 경로를 다 봐야 하는 문제 👉 DFS
- 최단 거리, 레벨 기반 탐색 👉 BFS
- 경로 추적 / 백트래킹 필요 👉 DFS
- 효율적인 탐색(큐 기반) 👉 BFS
문제별로 어떤 방법을 사용할지 선택하는게 중요합니다.