dfs(깊이 우선 탐색)과 bfs(너비 우선 탐색) 언제 사용하는 게 유리할까?
DFS는 한 경로를 따라 최대한 깊게 들어가서 더 이상 갈 곳이 없을 때까지 탐색한다. 그래서 한 경로의 끝까지 탐색한 후 다음 경로로 이동한다.
BFS는 한 노드에서 시작하여 인접한 모든 노드를 먼저 탐색한 후에 그 다음 단계의 노드로 이동한다. 즉, 한 레벨씩 탐색을 진행한다.
DFS
는 한 경로를 따라 깊이 우선적으로 탐색하기 때문에, 최악의 경우에는 모든 노드를 한 경로로 따라가게 될 수 있다. 따라서 트리의 깊이가 매우 깊은 경우에는 DFS가 더 많은 시간이 걸릴 수 있다.
BFS
는 레벨별로 탐색하기 때문에, 최단 경로를 찾는 문제에 적합하다. 일반적으로 DFS보다는 시간이 더 걸리지만, 최단 경로를 보장한다.
DFS
는 스택을 사용하여 탐색 경로를 저장하므로 메모리 사용량이 적다. 그러나 트리의 깊이가 깊을 경우에는 스택 오버플로우가 발생할 수 있다.
BFS
는 큐를 사용하여 탐색할 노드를 저장하므로 메모리 사용량이 더 많을 수 있다. 그러나 보통 효율적인 메모리 사용을 위해 인접 리스트 대신 인접 행렬을 사용하는 것이 좋다.
const graph = new Array(numVertices).map(() => []);
const graph = Array.from({ length: M }, () =>
Array.from({ length: N }, () => 0)
)
경로가 존재하는지
여부를 찾을 때 DFS가 유용하다. 깊이
를 우선적으로 탐색해야 하는 경우 DFS가 유용하다. 해결책의 수가 많은 경우
에 유용하다. 최단 경로
를 찾아야 할 때 BFS가 유용하다. 가중치가 주어진 경우
에는 BFS가 최소 비용 경로를 찾는 데 효과적이다. 최단 경로가 유일한 경우
BFS가 가장 효율적이다. 상태 공간
에서 최소 이동/변경 횟수
를 찾는 문제에는 BFS가 적합하다.