[Problem Solving - Baekjoon] 9663 N-Queen
[Baekjoon Online Judge] 9663 N-Queen
문제
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (1 ≤ N < 15)
출력
첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
예제
- input
8
- output
92
분류
- 백트래킹
풀이
문제 파악
- 대표적인 백트래킹문제
- 백트래킹 문제는 DFS 로 구현하는 것 이 쉬우나, BFS에 비해 시간이 오래 걸림
- 각 행을 차례대로 확인하면서, 각 열에 퀸을 놓는 경우를 고려
- 즉, 위쪽 행을 모두 확인하면서 현재 열에 위치에 놓을 수 있는지 확인
구현
- x번째 행에 대하여 처리
public static void dfs(int x ) {
if ( x == n ) {
result += 1;
}else {
// x번째 행의 각 열에 퀸을 두어서 괜찮은지 확인해보기
for (int i = 0; i < n ; i++) {
row[x] = i;
// 해당 위치에 두어도 괜찮은 경우
if (check(x)) {
// 다음 행으로 넘어가기
dfs(x+1);
}
}
}
}
- x번째 행에 놓은 Queen 에 대해서 위쪽, 대각선을 확인 하여 검증
public static boolean check(int x) {
// 이전 행에서 놓았던 모든 Queen 들을 확인
for (int i = 0; i < x; i++) {
// 위쪽 확인
if (row[x] == row[i]){
return false;
}
// 대각선 확인
if ((Math.abs(row[x] - row[i])) == x - i) {
return false;
}
}
return true;
}