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


체스판의 가로 세로의 세로의 길이 n이 매개변수로 주어질 때, n개의 퀸이 조건에 만족 하도록 배치할 수 있는 방법의 수를 return하는 solution함수를 완성해주세요.
제한사항- 퀸(Queen)은 가로, 세로, 대각선으로 이동할 수 있습니다.
- n은 12이하의 자연수 입니다.
백트래킹의 대표적인 문제 NQueen 문제입니다.
아래 블로그를 보며 공부하였습니다.
https://st-lab.tistory.com/118
[백준] 9663번 : N-Queen - JAVA [자바]
www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하..
st-lab.tistory.com
1. 1차원 배열을 생성 index 는 row 값이 될 것이고 value 는 col 값이 될 것입니다.
2. nQueen 이라는 재귀함수를 만든 후 시작인덱스 0을 넣어줍니다.
3. 재귀함수의 depth == n 일 경우 ( 퀸을 모두 놓음) 시 count++ , return 할 수 있도록 기저사례를 정합니다.
4. for문을 이용하여 arr[depth (row)] = i (col) 으로 초기화 하며 Possibility 라는 함수를 만들어 체크합니다.
5. Possibility 안에서 for문을 이용하여 현재 line 의 arr[row] 값과 다음 line 의 arr[i] 가 같지 않을 때 ( 같은 열이 아닐 때 )
그리고 [ row - i ] == [ arr[row] - arr[i] ] 가 아닐 때
( 대각선의 경우 현재 열 - 행 == 구할 값 arr[열] - arr[행] 의 절대 값이 같을 때 )
false 를 반환하고 통과하면 true를 반환
아래는 코드입니다.
import java.util.*;
class Solution {
static int n;
static int count=0;
static int[] arr;
public int solution(int nq) {
n = nq;
arr = new int[n];
nQueen(0);
return count;
}
public static void nQueen(int depth){
if (depth == n) {
count++;
return;
}
for (int i = 0; i < n; i++) {
arr[depth] = i;
if(Possibility(depth)){
nQueen(depth+1);
}
}
}
public static boolean Possibility(int col) {
for (int i = 0; i < col; i++) {
if (arr[col] == arr[i]) {
return false;
} else if (Math.abs(col - i) == Math.abs(arr[col] - arr[i])) {
return false;
}
}
return true;
}
}