가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다.
예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은 서로를 한번에 공격 할 수 없습니다.


체스판의 가로 세로의 세로의 길이 n이 매개변수로 주어질 때, n개의 퀸이 조건에 만족 하도록 배치할 수 있는 방법의 수를 return하는 solution함수를 완성해주세요.
퀸(Queen)은 가로, 세로, 대각선으로 이동할 수 있습니다.
n은 12이하의 자연수 입니다.
n: 4
2
queen이 n×n board에 n개가 존재하기 위해서는 무조건 한 row에 하나의 queen이 존재해야 한다. 즉, row를 0부터 n-1까지 반복해서 해당 row에서 위치할 수 있는 경우에 queen을 배치하고 다음 row를 체크하는 방식으로 처리한다.
function solution(n) {
var answer = 0;
let board = Array.from({length: n}, ()=>Array(n).fill(false));
function isValid(col, row) {
for(let i=0; i<row; i++) {
if (board[i][col]) return false;
}
for(let i=row-1, j=col-1; i>=0 && j>=0; i--, j--) {
if (board[i][j]) return false;
}
for(let i=row-1, j=col+1; i>=0 && j<n; i--, j++) {
if (board[i][j]) return false;
}
return true;
}
function DFS(row) {
if (row === n) {
answer++;
return;
}
for(let i=0; i<n; i++) {
if(isValid(i, row)) {
board[row][i] = true;
DFS(row+1);
board[row][i] = false;
}
}
}
DFS(0);
return answer;
}
N-Queen을 백트래킹으로 푸는 방법에 대해서는 최근에 공부를 하긴 했는데 막상 DFS로 구현하자고 하니 isValid를 어떻게 설계해야 할지 막막했다. 문제 풀이 유형에 집중하는 게 아니라 해당 풀이도 공부했어야 한다는 걸 다시 한 번... 실감하는 문제