
문제의 성격과 탐색 공간에 크기에 따라 차이가 납니다.
N-Queens 문제는 NxN 체스보드 위에 N개의 퀸을 서로 공격하지 않게 배치하는 문제입니다. 백트래킹을 사용하여 모든 가능한 배치를 탐색합니다.
주어진 n개의 원소로 모든 순열을 생성하는 문제입니다. 예를 들어, {1, 2, 3}의 순열을 생성하는 문제입니다.
주어진 n개의 원소에서 k개의 원소를 선택하는 모든 조합을 생성하는 문제입니다. 예를 들어, {1, 2, 3, 4}에서 2개의 원소를 선택하는 모든 조합을 생성하는 문제입니다.
주어진 n개의 원소로 만들 수 있는 모든 부분 집합을 생성하는 문제입니다.
void backtrack(상태 current) {
// (1) 해가 되는 조건 확인
if (해가 되는 조건) {
해를 저장하거나 출력
return;
}
// (2) 가능한 모든 선택지를 탐색
for (각 선택지 in 가능한 선택지들) {
// (3) 조건 확인
if (조건 확인(선택지)) {
선택지를 현재 상태에 추가 // (4) 상태 업데이트
backtrack(업데이트된 상태) // (5) 다음 단계로 재귀 호출
선택지를 현재 상태에서 제거 (백트랙킹) // (6) 백트랙킹: 재귀가 끝나면 선택지 제거(상태 복귀)
} // (7) 조건을 만족하지 않으면 이 선택지는 가지치기 (Pruning)
}
}
import java.util.*;
class Solution {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
int target = 5;
List<List<Integer>> results = new ArrayList<>();
backtrack(nums, target, 0, new ArrayList<>(), results);
}
public static void backtrack(int[] nums, int target, int start, List<Integer> current, List<List<Integer>> results) {
if (target == 0) { // (1) 해가 되는 조건: 목표 합에 도달
results.add(new ArrayList<>(current)); // 해를 저장
return;
}
// (2) 가능한 모든 선택지를 탐색
for (int i = start; i < nums.length; i++) {
// (3) 조건 확인: 현재 숫자가 남은 목표보다 작거나 같은지 확인
if (nums[i] <= target) {
current.add(nums[i]); // (4) 상태 업데이트
backtrack(nums, target - nums[i], i + 1, current, results); // (5) 다음 단계로 재귀 호출
current.remove(current.size() - 1); // (6) 백트래킹: 선택지 제거
} // (7) 조건을 만족하지 않으면 가지치기: 현재 숫자가 남은 목표보다 크면 넘어감
}
}
}
ref.
https://cordcat.tistory.com/128
https://evan-development.tistory.com/147