CS

[Algorithm] 깊이, 너비 우선 탐색(DFS, BFS)

Posted by DHniyeo Blog on September 22, 2023

DFS와 BFS의 정의

DFS와 BFS는 그래프 탐색 알고리즘으로, 그래프 데이터 구조에서 노드를 탐색하는 방법입니다. 대략적으로 500만 개 이하의 경우의 수는 DFS나 BFS를 활용하고 풀고 그보다 더 높은 경우의 수는 DP(다이나믹 프로그래밍)을 이용하여 풀이합니다.

1. DFS (깊이 우선 탐색)

DFS는 시작 노드에서 출발하여 다음 분기로 넘어가기 전에 해당 분기를 완전히 탐색하는 방식입니다. 스택(Stack) 또는 재귀 함수를 사용하여 구현할 수 있습니다. DFS는 더 깊은 단계의 노드를 먼저 탐색하고, 그래프의 깊은 부분을 우선적으로 탐색하는 특징이 있습니다.

2. BFS (너비 우선 탐색)

BFS는 시작 노드에서 가까운 노드부터 차례대로 탐색하는 방식입니다. 큐(Queue)를 사용하여 구현할 수 있습니다. BFS는 시작 노드에서 인접한 노드를 먼저 모두 탐색한 후, 다음 레벨의 노드로 이동하여 탐색하는 특징이 있습니다.

문제 푸는 절차

1. DFS 문제 풀이 방법:

깊이 우선 탐색(DFS) Flood fill

https://www.youtube.com/watch?v=M48Po-wTOpU

  • 시작 노드를 선택하고, 스택에 넣습니다.
  • 스택이 비어질 때까지 다음 단계를 반복합니다:
    • 스택에서 노드를 POP 합니다.
    • 해당 노드를 방문 처리하고, 원하는 목표에 도달했는지 확인합니다.
    • 인접한 미방문 노드를 스택에 넣습니다.

2. BFS 문제 풀이 방법:

너비 우선 탐색(BFS) Shortest path

https://www.youtube.com/watch?v=RxT7F6YA3TI

  • 시작 노드를 선택하고, 큐에 넣습니다.
  • 큐가 비어질 때까지 다음 단계를 반복합니다:
    • 큐에서 노드를 디큐합니다.
    • 해당 노드를 방문 처리하고, 원하는 목표에 도달했는지 확인합니다.
    • 인접한 미방문 노드를 큐에 인큐합니다.

특히, 경로 탐색 문제는 BFS로 풀어야 한다. DFS는 알고리즘 특성 상 모든 경우를 탐색한 후 최단 거리를 찾아야 한다.

DFS와 BFS는 다양한 그래프 문제를 해결하는 데 사용되며, 문제의 특성에 따라 적절한 알고리즘을 선택하여 적용합니다.

DFS, BFS 문제

대표적인 유형 : 경로 탐색, 네트워크, 조합 만들기 등.

1260 - DFS와 BFS

1303 - 전쟁 - 전투

2178 - 미로 탐색

1743 - 음식물 피하기

2606 - 바이러스

16930 - 달리기

16953 - A → B

12851 - 숨바꼭질2

13549 - 숨바꼭질3

13913 - 숨바꼭질 4

14226 - 이모티콘

17086 - 아기상어2