본문 바로가기
카테고리 없음

[자료구조개론] 10. DFS,BFS 깔끔 완벽 설명

by 설화님 2024. 9. 24.
그래프 탐색 알고리즘 (Graph Traversal Algorithms)

10. 그래프 탐색 알고리즘 (Graph Traversal Algorithms)

**그래프 탐색(Graph Traversal)**은 그래프에서 정점들을 체계적으로 방문하는 과정입니다. 그래프 탐색 알고리즘은 **깊이 우선 탐색(DFS, Depth-First Search)**과 **너비 우선 탐색(BFS, Breadth-First Search)**으로 나눌 수 있습니다. 이들은 그래프 내의 경로 탐색, 최단 경로 찾기, 연결성 확인 등의 문제를 해결하는 데 중요한 역할을 합니다.

10.1 깊이 우선 탐색 (Depth-First Search, DFS)

**깊이 우선 탐색(DFS)**은 그래프의 시작 정점에서부터 한 경로를 끝까지 탐색한 후, 더 이상 갈 곳이 없으면 되돌아와 다른 경로를 탐색하는 방식입니다. 이 방식은 재귀 또는 스택을 이용해 구현할 수 있습니다. DFS는 **순환적인 탐색**과 **미로 문제**와 같은 경우에 유리합니다.

DFS의 동작 방식

DFS는 다음과 같은 방식으로 동작합니다:

  1. 시작 정점에서 출발하여, 방문하지 않은 인접 정점으로 계속 이동합니다.
  2. 더 이상 이동할 인접 정점이 없으면, 이전 정점으로 돌아가서 다른 경로를 탐색합니다.
  3. 모든 정점을 방문할 때까지 이 과정을 반복합니다.
깊이 우선 탐색 (DFS) 예시

예제: 파이썬으로 DFS 구현

# 재귀를 이용한 DFS 구현
def dfs(graph, start, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)

    print(start, end=" ")  # 방문한 노드 출력

    # 인접 노드 방문
    for neighbor in graph[start]:
        if neighbor not in visited:
            dfs(graph, neighbor, visited)

# 그래프 정의 (인접 리스트)
graph = {
    1: [2, 3],
    2: [4, 5],
    3: [6],
    4: [],
    5: [],
    6: []
}

# DFS 실행
dfs(graph, 1)  # 출력: 1 2 4 5 3 6
        

이 예제는 파이썬을 사용하여 재귀적으로 DFS를 구현한 것입니다. DFS는 그래프의 깊은 부분부터 먼저 탐색하는 알고리즘입니다.

10.2 너비 우선 탐색 (Breadth-First Search, BFS)

**너비 우선 탐색(BFS)**은 시작 정점에서 가까운 정점부터 차례대로 방문하는 방식입니다. BFS는 큐(Queue)를 이용하여 구현하며, **최단 경로 탐색**에 적합합니다. 이 방식은 그래프에서 경로의 길이가 중요한 경우에 많이 사용됩니다.

BFS의 동작 방식

BFS는 다음과 같은 방식으로 동작합니다:

  1. 시작 정점을 큐에 넣고, 해당 정점을 방문합니다.
  2. 큐에서 정점을 꺼내, 해당 정점과 인접한 모든 방문하지 않은 정점을 큐에 삽입합니다.
  3. 더 이상 방문할 정점이 없을 때까지 이 과정을 반복합니다.
너비 우선 탐색 (BFS) 예시

예제: 파이썬으로 BFS 구현

from collections import deque

# BFS 구현
def bfs(graph, start):
    visited = set()
    queue = deque([start])

    while queue:
        vertex = queue.popleft()  # 큐에서 정점을 꺼냄
        if vertex not in visited:
            print(vertex, end=" ")
            visited.add(vertex)

            # 인접한 정점을 큐에 추가
            queue.extend(graph[vertex])

# 그래프 정의 (인접 리스트)
graph = {
    1: [2, 3],
    2: [4, 5],
    3: [6],
    4: [],
    5: [],
    6: []
}

# BFS 실행
bfs(graph, 1)  # 출력: 1 2 3 4 5 6
        

BFS는 큐를 이용해 구현되며, 시작 정점에서 가까운 정점부터 차례로 탐색합니다. 이 예제는 파이썬의 `deque`를 사용하여 BFS를 구현한 예시입니다.

10.3 DFS와 BFS의 차이점

DFS와 BFS는 모두 그래프 탐색 알고리즘이지만, 탐색 방식에서 큰 차이를 보입니다:

  • DFS: 깊은 곳부터 먼저 탐색하며, 재귀나 스택을 사용합니다. 특정 경로의 탐색이나 미로 찾기 문제에 유리합니다.
  • BFS: 가까운 곳부터 차례로 탐색하며, 큐를 사용합니다. 최단 경로를 찾는 문제에 유리합니다.
DFS와 BFS 비교

10.4 그래프 탐색 알고리즘의 응용

그래프 탐색 알고리즘은 다양한 문제 해결에 사용됩니다. 주요 응용 사례는 다음과 같습니다:

  • 경로 탐색: 미로 찾기나 지도에서 경로를 찾는 문제에 사용됩니다. DFS는 가능한 경로를 모두 탐색하고, BFS는 최단 경로를 찾습니다.
  • 최단 경로 탐색: BFS는 최단 경로를 찾는 문제에서 많이 사용되며, 다익스트라 알고리즘의 기초가 됩니다.
  • 네트워크 연결성 확인: DFS와 BFS는 네트워크에서 노드들이 연결되어 있는지 확인하는 데 사용됩니다.
  • 사이클 탐지: DFS는 그래프에서 사이클이 존재하는지 탐지하는 데 매우 유용합니다.