1. Back Tracking
DFS 방식으로 자료를 탐색할 때 유망하지 않은 것에 대해선 가지치기를 수행하여 이전으로 돌아가 재탐색하는 방식을 말한다.
여기서 유망하다는 것의 의미는 '답이 될 수 있는 경로'를 의미한다.
또한 가지치기란 유망하지 않은 것을 '잘라내다'라고 이해하면 된다.
2. 백 트래킹이 왜 필요할까?
기본적으로 DFS 방식은 주어진 모든 데이터를 순회하는 완전 탐색 기법이다.
따라서 백 트래킹 없이 탐색한다면 굳이 답이 되지 않는 경우도 탐색을 해야 돼서 시간적인 낭비라고 할 수 있다.
3. 대표적인 예시
nQueens 문제를 DFS 방식과 Back Tracking 방식을 통해 효율적으로 풀 수 있다.
nQueens 는 n by n의 체스판에서 n개의 queen을 놓을 수 있는 모든 경우의 수를 찾는 문제다.
queen은 거리에 상관없이 가로, 세로, 대각선에 위치한 다른 말들을 공격할 수 있다.
따라서 그러한 경우에 해당되지 않는 모든 경우의 수를 세야만 하는 것이다.
let solutionCount = 0;
let board = new Board({ n });
let boardArr = board.rows();
let countNQueens = function (col) {
if (board.hasAnyQueensConflicts()) {
return;
} // 체스판에서 queen의 충돌여부가 있으면 더 이상 재귀 호출이 이루어지지 않음
// 즉 유망하지 않은 길에 대한 가지치기라고 볼 수 있음.
if (col === boardArr.length) {
solutionCount++;
return;
} // 탈출 조건
for (let i = 0; i < boardArr.length; i++) {
board.togglePiece(i, col); // 말을 놓을 자리에 대해 좌표를 0 -> 1
countNQueens(col + 1); // 재귀 호출
board.togglePiece(i, col); // 0 -> 1로 만들었던 좌표를 다시 1 -> 0 으로 만들어야 함.
}
}
countNQueens(0);
return solutionCount;
'CodeStates' 카테고리의 다른 글
IM 22일차 (Promise & Async/Await) (0) | 2021.02.02 |
---|---|
IM 22일차 (자바스크립트 이벤트 루프) (0) | 2021.02.02 |
IM 13일차 (Graph) (0) | 2021.01.24 |
IM 11일차 (Tree, Binary Search Tree) (0) | 2021.01.24 |
IM 10일차 (Linked List) (0) | 2021.01.22 |