IT 초보 탈출 100일 챌린지
[100일의 IT 초보 탈출] #50 DFS(깊이 우선 탐색) _ 끝까지 파고들어야 보이는 것들
Prof.SSong
2025. 6. 16. 23:08
728x90
반응형
오늘은 무엇을 배우게 될까요?
지난 이틀간 우리는 스택(Stack)과 큐(Queue)라는 자료구조를 배웠습니다.
이제부터는 이 자료구조들이 알고리즘에서 실제로 어떻게 활용되는지를 알아보는 시간입니다.
오늘은 그래프 탐색 알고리즘 중 하나인 DFS(Depth-First Search)를 통해
문제 해결을 위한 깊이 우선 방식을 배워보겠습니다.
DFS란?
DFS(Depth-First Search)는 말 그대로 깊이 우선 탐색입니다.
- 하나의 정점에서 출발해 가능한 멀리 있는 노드를 먼저 탐색하고 막히면 되돌아가면서 다른 경로를 다시 탐색하는 방식입니다.
→ 스택(Stack) 자료구조를 기반으로 작동합니다.
(※ 재귀 함수도 스택처럼 동작합니다.)
DFS 탐색 순서
- 현재 노드를 방문 처리
- 연결된 노드 중 아직 방문하지 않은 노드로 이동
- 더 이상 이동할 노드가 없으면 되돌아감(백트래킹)
- 모든 노드가 탐색될 때까지 반복
DFS 예시 그래프
A
├── B
│ └── D
└── C
└── E
DFS 순서: A → B → D → C → E
DFS 실생활 비유
- 미로 탐험:
- 한 갈래길을 끝까지 가보다가, 막히면 되돌아가서 다른 길 탐색
- 중첩 폴더 탐색:
- 한 폴더 안의 폴더 안의 폴더까지 들어갔다가, 더 이상 없으면 위로 나옴
DFS 구현 방법
방법자료구조특징
재귀 방식 | 함수 호출 스택 | 간결하지만 깊이가 깊으면 StackOverflow 위험 |
반복 방식 | 명시적 스택 | 재귀보다 안전하지만 구현이 복잡할 수 있음 |
Python 코드 (재귀 DFS)
# 인접 리스트 방식 그래프
graph = {
'A': ['B', 'C'],
'B': ['D'],
'C': ['E'],
'D': [],
'E': []
}
visited = set()
def dfs(node):
if node not in visited:
print(node, end=' ')
visited.add(node)
for neighbor in graph[node]:
dfs(neighbor)
dfs('A')
출력 결과
A B D C E
Python 코드 (반복 DFS - 스택 사용)
def dfs_stack(start_node):
visited = set()
stack = [start_node]
while stack:
node = stack.pop()
if node not in visited:
print(node, end=' ')
visited.add(node)
# 연결 노드를 뒤집어서 넣어야 실제 탐색 순서 유지
stack.extend(reversed(graph[node]))
dfs_stack('A')
DFS의 시간 복잡도
- 노드 수: V, 간선 수: E
- → O(V + E) (그래프 탐색은 대부분 동일)
DFS의 활용 사례
분야활용 예시
알고리즘 | 미로 찾기, 백트래킹 문제, 경로 탐색 |
보안 | 순환 참조 탐지, 무한 루프 방지 |
컴퓨터 이론 | 위상 정렬, 사이클 검출 |
게임 | 퍼즐 게임 탐색, 갈림길 처리 로직 |
DFS vs BFS 비교
항목 DFS, BFS
탐색 순서 | 깊이 우선 | 너비 우선 |
자료구조 | 스택 / 재귀 | 큐 |
사용 목적 | 경로 추적, 완전 탐색 | 최단거리 탐색 |
구현 난이도 | 간단(재귀), 위험(Stack Overflow) | 메모리 더 필요하지만 안전 |
※ BFS는 51일차에서 자세히 다룰 예정입니다.
한 줄 요약
👉 DFS는 한 갈래를 끝까지 파고드는 방식의 탐색 알고리즘으로,
문제 해결과 백트래킹에 매우 효과적인 도구입니다.
728x90
반응형