[๋ฐฑ์ค, Java] 9663๋ฒ : N-Queen
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/9663
๐ฎ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ฒซ ๋ฒ์งธ ํ๋ถํฐ ์ฐจ๋ก๋ก ๋ชจ๋ ๋ฐฐ์น์ ํธ์ ๋์๋ณด๋ ๋ฐฉ์์ ์์ ํ์ ๋ฌธ์ ์ด๋ค.
ํธ์ ๋ฐฐ์นํ๊ธฐ ์ ์ ์ด์ ํ์ ๋์ธ ํธ ๋ค์ด ์์ง์ผ ์ ์๋ ์์น์ ๋์์ผ ํ๊ธฐ ๋๋ฌธ์ ํ ๋ง๋ค ํธ์ ๋ฐฐ์นํ๋ฉด์ ์ด์ ํ์ ํธ์ ๋ฐฐ์น์ ๊ฒน์น์ง ์๋์ง ํ๋จํ๋ ๋ก์ง์ ์ถ๊ฐํ๋ค.
์ด์ ํ์ ํธ๋ค๊ณผ ๊ฒน์น ์ ์๋ ๊ฒฝ์ฐ๋ 2๊ฐ์ง๊ฐ ์๋ค.
- ์ด์ ํ๋ค์ ๋์ธ ํธ์ ์ด๊ณผ ํ์ฌ ๋์ ํธ์ ์ด์ด ๋์ผํ ๊ฒฝ์ฐ
- ์ด์ ํ๋ค์ ๋์ธ ํธ๊ณผ ํ์ฌ ๋์ ํธ์ด ๋๊ฐ์ ์ ์กด์ฌํ๋ ๊ฒฝ์ฐ
๋์ผํ ํ์ ํธ์ด ๋์ด๋ ๊ฒฝ์ฐ๋ ๊ณ ๋ คํด์ผํ์ง๋ง, ์ฌ๊ท๋ฅผ ์ด์ฉํด ํ ํ (depth)๋ง๋ค ํธ์ ๋ฐฐ์นํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋์ผํ ํ์ ๋ ๊ฐ์ด์์ ํธ์ด ๋์ด๋ ๊ฒฝ์ฐ๋ ๋ฐ์ํ์ง ์๋๋ค.
๊ฐ ํ (depth)๋ง๋ค ํธ์ ์ด ์์น๋ฅผ ์ ์ฅํ pos ๋ฐฐ์ด์ ์ด์ฉํ๋ค.
์๋ฅผ ๋ค์ด, pos[2]๋ 2์ธ๋ฐ ์ด๋ 2ํ 2์ด์ ํธ์ด ๋์์ ธ ์๋ค๋ ๋ป์ด๋ค.
pos ๋ฐฐ์ด์ ์ด์ฉํด ์ด์ ํธ์ ํ๊ณผ ์ด์ ํ๋จํ ์ ์๊ณ , ๋งค ํ๋ง๋ค ํ์ฌ ํธ์ ๋ฐฐ์นํ ํ๊ณผ ์ด์ ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํธ์ ๋์ ์ ์๋์ง๋ฅผ ํ๋จํ๋ค.
1๋ฒ ์กฐ๊ฑด์ ํ๋จํ ๋๋ pos[์ด์ ํ]๊ณผ ํ์ฌ ํธ์ ๋ฐฐ์นํ ์ด์ ์ด์ฉํด ํ๋จํ๋ค.
2๋ฒ ์กฐ๊ฑด์ ํ๋จํ ๋๋ ์ด์ ํ๊ณผ ํ์ฌ ํ์ ์ฐจ์ด, ์ด์ ํ๋ค์ ๋์ธ ์ด๊ณผ ํ์ฌ ์ด ์ฐจ์ด์ ๊ฐ์ด ๋์ผํ ๊ฒฝ์ฐ ๋ ๋๊ฐ์ ์ ๋์ธ ๊ฒฝ์ฐ์์ ์ ์์๋ค.
๋ฐ๋ผ์, |pos[์ด์ ํ] - ํ์ฌ ์ด| == |์ด์ ํ - ํ์ฌ ์ด| ์ธ ๊ฒฝ์ฐ ๋๊ฐ์ ์ ์์นํ๋ ๊ฒฝ์ฐ์ด๋ค.
๐ฉ Java ์ฝ๋
package com.algorithm.Baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main_9663_NQueen {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] pos = new int[N];
int rst = nQueen(N, pos);
System.out.println(rst);
br.close();
}
private static int count;
private static int nQueen(int N, int[] pos) {
count = 0;
putQueen(0, pos, N);
return count;
}
private static void putQueen(int row, int[] pos, int n) {
// ๋ชจ๋ ํ์ ํธ์ ๋ค ๋ฐฐ์นํ ๊ฒฝ์ฐ ๊ฐ์ ์ฆ๊ฐ
if(row == n) {
count++;
return;
}
// 0๋ฒ์งธ ์ด ๋ถํฐ n ๋ฒ์ฌ ์ด ๊น์ง
for(int col = 0; col < n; col++) {
pos[row] = col; // ํ์ฌ ํ์ ํธ์ ์ด์์น๋ฅผ ์ ์ฅ
if(possible(row, col, pos)) {
putQueen(row + 1, pos, n);
}
}
}
// ํ์ฌ ์์น์ ํธ์ ๋ฐฐ์นํ ์ ์๋์ง ํ๋จ
private static boolean possible(int curRow, int curCol, int[] pos) {
// ์ฒซ ๋ฒ์งธ ํ๋ถํฐ ํ์ฌ ํ ๊น์ง ๋์ธ ํธ์ ํ๋จ
for(int row = 0; row < curRow; row++) {
// 1. ์ด์ ์ ๋์ธ ํธ์ ์ด๊ณผ ํ์ฌ ํธ์ ์ด์ด ๋์ผํ๋ฉด ๊ฒน์น๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก false
if(pos[row] == curCol) return false;
// 2. "์ด์ ํ๊ณผ ํ์ฌ ํ์ ์ฐจ์ด"์ "์ด์ ํ์ ์ด๊ณผ ํ์ฌ ํ์ ์ด์ ์ฐจ์ด"๊ฐ ๋์ผํ ๊ฒฝ์ฐ๋ ๋๊ฐ์ ์ ํธ์ด ๋์ธ ๊ฒฝ์ฐ์ด๋ฏ๋ก ๊ฒน์น๋ ๊ฒฝ์ฐ false
if(Math.abs(row - curRow) == Math.abs(pos[row] - curCol)) return false;
}
// 3. ์ด์ธ์ ๊ฒฝ์ฐ๋ ๊ฒน์น์ง ์๋ ๊ฒฝ์ฐ
return true;
}
}