모든 가능한 경우를 탐색하되, 유망하지 않으면 가지치기를 하여 효율적으로 탐색하는 기법
1. 핵심 개념 요약
- 의미: 가능한 해를 모두 고려하되, 조건에 맞지 않으면 되돌아감
- 활용: 완전 탐색보다 효율적이며, 가지치기(pruning)를 통해 시간 단축
- 주요 사용처: 순열, 조합, N-Queen, 미로 탐색, 스도쿠
2. 동작 원리
- 현재 상태에서 가능한 선택을 하나 고름
- 그 선택이 유망한지 검사
- 유망하다면 재귀적으로 다음 선택 진행
- 조건에 맞지 않으면 되돌아가서(Backtrack) 다른 선택 시도
3. 예제 코드 (Java) - 숫자 1~3으로 만든 길이 2의 순열
public class BacktrackingExample {
static int N = 2; // 만들 조합의 길이
static int[] numbers = {1, 2, 3};
static boolean[] visited = new boolean[3];
static int[] result = new int[N];
public static void main(String[] args) {
backtrack(0);
}
public static void backtrack(int depth) {
if (depth == N) { // 길이가 N이 되면 출력
for (int num : result) {
System.out.print(num + " ");
}
System.out.println();
return;
}
for (int i = 0; i < numbers.length; i++) {
if (!visited[i]) { // 아직 사용하지 않은 숫자라면
visited[i] = true; // 사용 처리
result[depth] = numbers[i]; // 현재 자리에 숫자 배치
backtrack(depth + 1); // 다음 깊이 재귀 호출
visited[i] = false; // 되돌아오며 원상복구 (Backtrack)
}
}
}
}
🔍 출력 예시
1 2
1 3
2 1
2 3
3 1
3 2
4. 특징
- 탐색 전략: DFS 기반
- 시간 복잡도: 모든 경우의 수를 다 보는 O(n!)에 가까움
(하지만 가지치기로 일부 줄일 수 있음)
- 사용법 핵심: 조건 검사 + 방문 여부 처리 + 재귀 + 복구
5. 대표 예시 문제
문제 유형 | 예시 |
순열/조합 | 1~N까지 숫자의 모든 순열 |
퍼즐 해결 | N-Queen, 스도쿠 |
경로 찾기 | 미로 탐색, 그래프 경로 탐색 |
6. 백트래킹 vs 완전탐색
구분 | 백트래킹 | 완전탐색 |
탐색 방식 | 조건에 따라 가지치기 | 가능한 모든 경우 다 탐색 |
효율성 | 조건 검사 후 불필요한 분기 제거 | 시간 오래 걸릴 수 있음 |
사용 구조 | 재귀 + 조건문 + 백트랙 | 반복문 + 브루트포스 구조 |
Share article