백트래킹이란 해를 찾는 도중에 막히면 더 이상 깊이 들어가지 않고, 이전 단계로 되돌아가서 해를 찾아나가는 기법을 말한다.
백트래킹은 DFS의 일종으로, 가능한 모든 경우의 수를 탐색한다.
가지치기(pruning)를 통해 조건을 만족하지 않는 경우에는 더 이상 탐색하지 않고 이전 단계로 돌아간다.
해결책을 찾을 때까지 탐색을 계속하며, 해를 찾으면 중지한다.
메모리를 적게 사용한다.
백준 문제 N과 M
을 통해 백트래킹을 사용해보자.
https://www.acmicpc.net/problem/15649
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하는 문제이다.
const fs = require("fs");
const [N, M] = fs.readFileSync("./input.txt").toString().split(" ").map(Number);
let result = "";
function findCombination(arr) {
// 후보해가 해결책인지 확인
if (arr.length === M) {
result += arr.join(" ") + "\n"; // 현재 조합을 결과에 추가
return; // 가지치기: M개가 넘는 조합은 필요없다!
}
// 재귀적으로 후보군을 탐색
for (let i = 1; i <= N; i++) {
if (!arr.includes(i)) {
arr.push(i);
findCombination(arr);
arr.pop(); // 백트래킹: 이전 단계로 되돌아가고 다른 후보 찾기
}
}
}
findCombination([], 1);
console.log(result);