Interview
Backtracking(백트래킹)과 DFS의 차이점
DevOps Engineer
2025. 3. 17. 23:43
728x90
1. DFS (Depth-First Search, 깊이 우선 탐색)
DFS는 그래프 탐색 알고리즘 중 하나로, 한 경로를 끝까지 탐색한 후 다른 경로를 탐색하는 방식입니다.
- 보통 재귀(Recursion)나 스택(Stack) 을 사용하여 구현합니다.
- 그래프 탐색에서 특정 노드를 방문한 후, 그 자식 노드들을 방문하는 방식입니다.
- DFS는 모든 가능한 경우를 무조건 탐색하는 경우가 많습니다.
예시: 그래프에서 DFS 탐색
graph = {
1: [2, 3],
2: [4, 5],
3: [6],
4: [],
5: [],
6: []
}
visited = set()
def dfs(node):
if node in visited:
return
visited.add(node)
print(node)
for neighbor in graph[node]:
dfs(neighbor)
dfs(1) # 출력: 1 2 4 5 3 6
2. Backtracking (백트래킹)
백트래킹은 DFS를 기반으로 불필요한 탐색을 가지치기(pruning)하여 최적화하는 기법입니다.
- 모든 경우를 탐색하는 것이 아니라, 가능성이 없는 경로는 빨리 포기(가지치기) 합니다.
- 해가 될 가능성이 없는 경우, 재귀 호출을 중단하여 불필요한 계산을 줄입니다.
- 주로 조합(combination), 순열(permutation), 부분집합(subset) 문제에서 사용됩니다.
백트래킹 예시 (순열)
아래 코드는 DFS를 사용하여 모든 순열을 탐색하지만, 이미 선택한 숫자는 다시 선택하지 않도록 하여 가지치기를 합니다.
def permute(nums):
res, item = [], []
def dfs():
if len(item) == len(nums):
res.append(item[:]) # 정답 리스트에 추가
return
for num in nums:
if num not in item: # 이미 선택한 숫자는 다시 선택하지 않음 (가지치기)
item.append(num)
dfs()
item.pop() # 백트래킹: 원상복구
dfs()
return res
print(permute([1, 2, 3]))
# 출력: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
결론: DFS vs Backtracking
개념설명특징
DFS (깊이 우선 탐색) | 모든 경로를 탐색하는 방식 | 그래프 탐색, 트리 탐색 등에 사용됨 |
Backtracking (백트래킹) | DFS 기반이지만, 불가능한 경로는 가지치기 | 조합, 순열, N-Queen, Sudoku, 부분집합 문제에서 자주 사용됨 |
즉, 백트래킹은 DFS의 일종이지만, 최적화를 위해 가지치기를 추가한 기법입니다.
728x90