[TIL] 내일배움캠프 70일차_[Python] 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS)
👀Today I LearnPermalink
1. 깊이 우선 탐색(DFS)Permalink
- DFS는 한 노드를 방문하면 최대한 깊이 내려간 후, 더 이상 갈 곳이 없으면 다시 돌아오는 방식으로 탐색하는 알고리즘
- 주로 재귀(Recursion) 또는 스택(Stack) 을 이용하여 구현
DFS의 특징Permalink
- 한 방향으로 깊이 탐색 후 백트래킹 (되돌아가기)
- 재귀 함수 또는 스택을 이용한 구현
- 그래프의 모든 정점을 방문하는 데 사용됴됨
- 최단 경로 탐색에는 부적합 (너비 우선 탐색이 더 적합)
- 트리나 그래프에서 경로를 찾거나 특정 패턴을 탐색할 때 유용
DFS의 동작 방식Permalink
-
다음과 같은 그래프를 가정
1 /|\ 2 3 4 | | 5 7 | 6
- 첫 번째 노드(1)부터 시작
- 방문할 수 있는 한 계속 내려감 (DFS 특성)
- 더 이상 갈 곳이 없으면 백트래킹하여 다른 길 탐색
DFS의 구현 : 재귀Permalink
# 그래프를 인접 리스트 방식으로 표현
graph = {
1: [2, 3, 4],
2: [5, 6],
3: [],
4: [7],
5: [],
6: [],
7: []
}
# DFS 구현 (재귀 방식)
def dfs_recursive(node, visited):
if node not in visited:
visited.append(node)
print(node, end=' ')
for neighbor in graph[node]:
dfs_recursive(neighbor, visited)
# 실행
visited = []
dfs_recursive(1, visited)
DFS의 구현 : 스택Permalink
# DFS 구현 (스택 사용)
def dfs_stack(start):
stack = [start]
visited = []
while stack:
node = stack.pop()
if node not in visited:
visited.append(node)
print(node, end=' ')
stack.extend(reversed(graph[node])) # 스택에서 뒤집어서 넣어야 순서 유지
# 실행
dfs_stack(1)
2. 너비 우선 탐색(BFS)Permalink
- BFS는 현재 방문한 노드에서 인접한 노드들을 먼저 모두 방문한 후, 다음 깊이의 노드들을 방문하는 탐색 방법
- 주로 큐(Queue) 를 사용하여 구현
BFS의 특징Permalink
- 가까운 노드부터 탐색하는 방식
- 큐를 이용한 구현
- 최단 경로 탐색에 적합
- DFS보다 메모리 사용량이 많을 수 있음
- 레벨별 탐색이 필요할 때 유용함
BFS의 동작 방식Permalink
-
위에서 사용한 동일한 그래프에서 탐색을 수행
- 시작 노드(1)에서 인접한 모든 노드(2, 3, 4)를 먼저 방문
- 다음 깊이의 노드(5, 7)를 방문
- 계속해서 큐에서 꺼내며 탐색 진행
BFS의 구현 : 큐Permalink
from collections import deque
# BFS 구현 (큐 사용)
def bfs(start):
queue = deque([start])
visited = []
while queue:
node = queue.popleft()
if node not in visited:
visited.append(node)
print(node, end=' ')
queue.extend(graph[node])
# 실행
bfs(1)
3. DFS vs BFS 비교Permalink
비교 항목 | DFS (깊이 우선 탐색) | BFS (너비 우선 탐색) |
---|---|---|
탐색 방식 | 최대한 깊이 탐색 후 백트래킹 | 현재 노드와 인접한 노드부터 탐색 |
자료구조 | 스택 (재귀 또는 명시적 사용) | 큐 사용 |
최단 경로 | X (경로 찾기에 적합하지 않음) | O (최단 경로 탐색에 유리) |
메모리 사용량 | 적을 수 있음 | 많을 수 있음 (너비 탐색 특성상 많은 노드 저장) |
구현 방식 | 재귀 또는 스택 | 큐 |
실행 순서 차이 예시Permalink
-
DFS 실행 결과:
1 → 2 → 5 → 6 → 3 → 4 → 7
-
BFS 실행 결과:
1 → 2 → 3 → 4 → 5 → 7 → 6
4. DFS/BFS 활용 예시Permalink
📌DFS가 유용한 경우Permalink
- 백트래킹 (예: N-Queen 문제, 순열 생성)
- 모든 경로 탐색 (예: 미로 찾기, 게임 맵 탐색)
- 트리 구조 탐색 (예: 이진 트리 순회)
📌BFS가 유용한 경우Permalink
- 최단 거리 탐색 (예: 최단 경로 문제, 다익스트라 알고리즘)
- 네트워크 탐색 (예: SNS 친구 추천, 웹 크롤링)
- 망 분할 탐색 (예: 전염병 확산 시뮬레이션)
5. 결론Permalink
- DFS와 BFS는 그래프 탐색에서 매우 중요한 알고리즘
- 요약
- DFS: 깊이 우선 탐색, 백트래킹 활용, 스택/재귀 구현
- BFS: 너비 우선 탐색, 최단 거리 탐색에 적합, 큐 구현
💡Today I ThoughtPermalink
오늘의 체크리스트Permalink
- 알고리즘 코드카타 311-315
- SQL 코드카타 104
- AI 모델 활용 2주차 강의 듣기
- 딥러닝 복습
- TIL 작성
회고Permalink
오늘 하루도 알차게 마무리! 어제 스탠다드반에서 딥러닝을 다뤄서 다시 공부했는데, 모르는 개념이 아직도 많이 넘친다. 딥러닝 공부는 계속 필요할 것 같다. 스탠다드반에서 과제주면 꼬박꼬박 하면서 또 성장해야지🫠
댓글남기기