본문 바로가기
JavaScript/Leetcode

N-Queens II

by lacuca9 2024. 10. 24.

문제

The n-queens puzzle is the problem of placing n queens on an n x n chessboard

such that no two queens attack each other.

Given an integer n, return the number of distinct solutions to the n-queens puzzle.


Example 1:


Input: n = 4
Output: 2
Explanation: There are two distinct solutions to the 4-queens puzzle as shown.


Example 2:
Input: n = 1
Output: 1
 
Constraints:
1 <= n <= 9


풀이

파이썬으로 하루종일 답보고 분석했던 문제다.

같은 행과 대각선에 배치되지 않게 놓을 수 있는 경우의 수를 구하는 문제다.

 

백트래킹, 재귀, 자바스크립트 화살표 함수를 공부할 수 있는 아주 양질의 문제이다.

 

2차원 배열로 (x, y) 형태의 좌표를 이용해서 코드를 짰었는데,

1차 배열로 구현 가능하다.

ex) [2, 0, 3, 1]

이때 배열의 index는 행이 되고 value는 열이 된다.

즉 좌표로 표현하면 (i, arr[i])

 


답안

/**
 * @param {number} n
 * @return {number}
 */
var totalNQueens = function (n) {
  let count = 0;
  let cols = new Set();
  let diag1 = new Set();
  let diag2 = new Set();

  const backtrack = (row) => {
    if (row === n) {
      count++;
      return;
    }

    for (let col = 0; col < n; col++) {
      // 행, 대각선 중복 확인
      if (cols.has(col) || diag1.has(row - col) || diag2.has(row + col)) {
        continue;
      }
      // 각 중복확인용 배열에 추가
      cols.add(col);
      diag1.add(row - col);
      diag2.add(row + col);

      // row값 1 증가시켜서 재귀
      backtrack(row + 1);

      // 볼 일 다 봤으면 제거하고 다음 col로 비교
      cols.delete(col);
      diag1.delete(row - col);
      diag2.delete(row + col);
    }
  };
  backtrack(0);
  return count;
};

'JavaScript > Leetcode' 카테고리의 다른 글

Generate Parentheses (Medium)  (0) 2024.10.23
132 Pattern (Medium)  (0) 2024.10.23
Trapping Rain Water (Hard)  (5) 2024.10.23
Group Anagrams (Medium)  (1) 2024.09.28
Container With Most Water (Medium)  (0) 2024.09.27