DFS와의 차이점
- DFS: 일반적으로 완전 탐색 목적으로, 재귀 함수를 이용해 구현
- 백트래킹: 재귀 함수 이용하여 구현하는 것이 일반적이지만, 단순히 완전 탐색하는 것이 아니라 조건에 따라서 유망한 노드로 이동!
인접 행렬
인접 리스트
문제: NXN 체스 보드 위에 퀸 N개가 서로 공격할 수 없게 놓는 문제
풀이
let n = 0; // 전체 맵(map)의 크기
let queens = []; // 현재 체스판에 놓은 퀸의 위치 정보들
// (x, y) 위치에 퀸을 놓을 수 있는지 확인
function possible(x, y) {
// 현재까지 놓았던 모든 퀸의 위치를 하나씩 확인하며
for (let [a, b] of queens) {
if (a == x || b == y) return false; // 행이나 열이 같다면 놓을 수 없음
if (Math.abs(a - x) == Math.abs(b - y)) return false; // 대각선에 위치한 경우 놓을 수 없음
}
return true;
}
let cnt = 0;
function dfs(row) {
if (row == n) cnt += 1; // 퀸을 N개 배치할 수 있는 경우 카운트
// 현재 행에 존재하는 열을 하나씩 확인하며
for (let i = 0; i < n; i++) {
if (!possible(row, i)) continue; // 현재 위치에 놓을 수 없다면 무시
queens.push([row, i]); // 현재 위치에 퀸 놓기
dfs(row + 1); // 재귀 함수 호출
queens.pop(); // 혀냊 위치에서 퀸 제거
}
}
function recursive() {
if 종료 조건을 만족한다면 {
처리;
}
for 자식 노드를 하나씩 확인하며 {
if 임의의 조건을 만족한다면 {
자식 노드 방문 처리;
재귀 함수 호출;
자식 노드 방문 처리 해제;
}
}
}