[프로그래머스] 레벨3 (level3) N Queen

2020년 06월 28일, 22:20

N Queen

문제 설명

가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다.

예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은 서로를 한번에 공격 할 수 없습니다.

체스판의 가로 세로의 세로의 길이 n이 매개변수로 주어질 때, n개의 퀸이 조건에 만족 하도록 배치할 수 있는 방법의 수를 return하는 solution함수를 완성해주세요.

제한사항

  • 퀸(Queen)은 가로, 세로, 대각선으로 이동할 수 있습니다.
  • n은 12이하의 자연수 입니다.

입출력 예

n result
4 2

입출력 예 설명

입출력 예 #1
문제의 예시와 같습니다.

문제풀이

  1. cols 배열을 선언. 열을 표시.
  2. 재귀를 이용해서 탐색.
  3. row가 n일 경우에는 answer를 증가시킴(조건 만족.)
  4. x,y좌표를 모두 돌아보면서 확인.
  5. isPromising과정에서 가로,세로에 대해서 확인하고, 대각선을 확인.
function solution(n) {
  let answer = 0;
  let cols = Array(n).fill(0);
  answer = dfs(n, cols, 0, answer);
  return answer;
}

function dfs(n, cols, row, answer) {
  if (n === row) return ++answer;
  for (let i = 0; i < n; i++) {
    cols[row] = i;
    if (isPromising(row, i, cols)) {
      answer = dfs(n, cols, row + 1, answer);
    }
  }
  return answer;
}

function isPromising(x, y, cols) {
  for (let i = 0; i < x; i++) {
    if (cols[i] === y || Math.abs(x - i) === Math.abs(y - cols[i]))
      return false;
  }
  return true;
}