
N-Queen ๋ฌธ์ ๋ ํฌ๊ธฐ๊ฐ N ร N์ธ ์ฒด์คํ ์์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๋ฌธ์ ์ด๋ค.
N์ด ์ฃผ์ด์ก์ ๋, ํธ์ ๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N < 15)
์ฒซ์งธ ์ค์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
8
92
์ด ๋ฌธ์ ๋ ๋ํ์ ์ธ ๋ฐฑํธ๋ํน(BackTracking)๋ฌธ์ ์
๋๋ค.
๋ฌธ์ ์ดํด๋ฅผ ์ํด ์กฐ๊ธ ๋ ์ค๋ช
ํ์๋ฉด,
ํธ์ ์ฒด์ค์์ ๊ฐ์ ํ, ์ด, ๋๋ ๋๊ฐ์ ์์ ์๋ ๋ง์ ๊ณต๊ฒฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, 8 x 8 ์ฒด์คํ์ด ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค๋ฉด, ์ด ๋ฌธ์ ์ solution ์ค ํ ๊ฐ์ง๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.

์ด ๊ฒฝ์ฐ ๊ท์น์ ์ํด ๋ฐฐ์น๋ 8๊ฐ์ ํธ์ ์๋ก ๊ณต๊ฒฉํ ์ ์๋ ๊ฒฝ์ฐ์ ์๊ฐ ํ๋๋ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ์ด๋ฌํ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ชจ๋ ๊ตฌํ๋ ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ DFS๋ฅผ ์ฌ์ฉํด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ ๋ คํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.

์๋ฅผ ๋ค์ด N์ด 4์ธ ๊ฒฝ์ฐ, 0๋ฒ ํ์ ๋๋ ํธ์ ์์น๋ ์ด๋ ๊ฒ 4๊ฐ์ง์ ๋๋ค.

๋ง์ฝ ์ฒซ ๋ฒ์งธ๋ฅผ ๊ฑฐ์ณ ๋ ๋ฒ์งธ ๊ฒฝ์ฐ์์ DFS ํ์์ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด, 1๋ฒ ํ์ ํธ์ ๋ฐฐ์นํ๋ 4๊ฐ์ง ๊ฒฝ์ฐ์ ์๋ก ๋ถ๊ธฐ๊ฐ ๋ ๊ฒ์
๋๋ค.
ํ์ง๋ง, ์ฒซ ๋ฒ์งธ ~ ์ธ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ๊ทธ ์ ํ์ ๋ฐฐ์น์์ผ ๋์๋ ํธ์๊ฒ ๊ณต๊ฒฉ์ ๋ฐ์ ์ ์๋ ์ํฉ์
๋๋ค. ์ด ๊ฒฝ์ฐ๋ค์ ์ ๋ solution์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ํ์์ ์งํํ์ง ์๋๋ก ํฉ๋๋ค.
๋ฐ๋ผ์ ๋ค ๋ฒ์งธ ๊ฒฝ์ฐ์๋ง ๊ณ์ํด์ ํ์์ ์งํํ๋๋ก ํด์ผ ํฉ๋๋ค.
์ด๋ ๋ฏ, ๊ท์น์ ๋ฐ๋ผ ํธ์ ๋ฐฐ์นํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ง๋ฌ์ ๊ฒฝ์ฐ์๋ ๋ ์ด์ ํ์ํ์ง ์๋๋ก ์ข
๋ฃ ์กฐ๊ฑด์ ์ ์ธ์์ฃผ์ด์ผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ํ์ํ ์ ์์ต๋๋ค.
์ด์ ๊ตฌํ์ ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
static int[] arr;
static int sum;
arr ๋ฐฐ์ด์ ๊ฐ ํ์ ํธ์ด ๋์ธ ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํฉ๋๋ค.
์๋ฅผ ๋ค์ด, arr[0]์ ์ฒซ ๋ฒ์งธ ํ์ ํธ์ด ๋์ธ ์ด์ ๋ํ๋
๋๋ค.
sum ๋ณ์๋ ํธ์ ๋ฐฐ์นํ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ธ๊ธฐ ์ํด ์ฌ์ฉํ์ต๋๋ค.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
arr = new int[n];
dfs(0, n);
System.out.println(sum);
sc.close();
}
Scanner๋ฅผ ํตํด n์ ์
๋ ฅ๋ฐ๊ณ , ํด๋น ํฌ๊ธฐ ๋งํผ arr ๋ฐฐ์ด์ ์์ฑํด ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ dfs ๋ฉ์๋๋ฅผ ํธ์ถํด ํ์์ ์์ํ๋๋ฐ, ํ๋ผ๋ฏธํฐ๋ก ํ์ฌ ํ๊ณผ ์ฒด์คํ์ ํฌ๊ธฐ n์ ๋ณด๋ด์ฃผ๋๋ก ํฉ๋๋ค.
public static void dfs(int start, int n) {
// ์ข
๋ฃ ์กฐ๊ฑด : ๋ชจ๋ ํ์ ํธ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐฐ์นํ๋ค๋ฉด
if (start == n) {
sum += 1;
return;
}
for (int i = 0; i < n; i++) {
boolean check = true; // ํ์ฌ ์ด์ ํธ์ ๋์ ์ ์๋ ์ง์ ๋ํ ์ฌ๋ถ
for (int j = 0; j < start; j++) {
// ๊ฐ์ ์ด์ ํธ์ด ์๋ ์ง
// ์ผ์ชฝ ๋ฐฉํฅ ๋๊ฐ์ ์ ํธ์ด ์๋ ์ง
// ์ค๋ฅธ์ชฝ ๋ฐฉํฅ ๋๊ฐ์ ์ ํธ์ด ์๋ ์ง
if (arr[j] == i || arr[j] + (start - j) == i || arr[j] - (start - j) == i) {
check = false;
break;
}
}
if (check) {
arr[start] = i;
dfs(start + 1, n);
}
}
}
์ฐ์ , ์ข
๋ฃ ์กฐ๊ฑด์ ๋จผ์ ์ธ์ ์ฃผ์์ต๋๋ค.
ํ์์ด ์ข
๋ฃ๋์๋ค๋ ๊ฒ์ nํ๊น์ง ํ์์ ํ๋ค๋ ์๋ฏธ์ด๊ณ , nํ๊น์ง ํ์์ ํ๋ค๋ ์๋ฏธ๋ solution(ํธ์ ๊ณต๊ฒฉ๋ฐ์ง ์๋ ์์น์ ๋ชจ๋ ๋ฐฐ์นํ ๊ฒฝ์ฐ)์ ๋ฐ๊ฒฌํ ๊ฒฝ์ฐ์ด๊ธฐ ๋๋ฌธ์, sum์ 1์ ๋ํ๊ณ ํ์์ ์ข
๋ฃํฉ๋๋ค.
์ข
๋ฃ ์กฐ๊ฑด์ ์ธ์ ์ผ๋ ์ด์ ํ์ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค.
์ฐ์ , ํ์ฌ ํ(start)์์ ํธ์ ๋ฐฐ์นํ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ ์ด n๊ฐ์ง ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ , ํ์ฌ ํ(start)๋ณด๋ค ์์ ๋ฐฐ์นํ๋ ํธ๋ค์ ์์น๋ฅผ ํ์
ํด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด ์ด์ ํ์ ๋ํ ์์น j๋ฅผ ์ค์ ํด ์ค๋๋ค.
์ด์ 3๊ฐ์ง ์กฐ๊ฑด์ ๋ฐ์ ธ์ ํ์ฌ ์์น์ ํธ์ ๋ฐฐ์นํ ์ ์๋ ์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
์ด ์ธ ๊ฐ์ง ์กฐ๊ฑด ์ค ํ๋๋ผ๋ ์ฐธ์ด๋ฉด, ํด๋น ์์น์๋ ํธ์ ๋์ ์ ์๊ณ , ๋ชจ๋ ํด๋นํ์ง ์๋๋ค๋ฉด, ํด๋น ์์น์ ํธ์ ๋์ ์ ์๊ธฐ ๋๋ฌธ์, arr๋ฐฐ์ด์ ํด๋น ์ด์ ์์น i๋ฅผ ์ ์ฅํ๊ณ , ์ฌ๊ท๋ฅผ ํตํด ํ์์ ์ด์ด๋๋๋ก ํด ์ค๋๋ค.
์ต์ข
์ ์ผ๋ก start๊ฐ n๊น์ง ๋ค๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๊ฐ sum์ ์ ์ฅ๋๊ณ , ๊ตฌํ๊ณ ์ ํ๋ solution์ ๊ฐ์๊ฐ ๋ฉ๋๋ค.
import java.util.*;
public class SWEA_2806 {
static int[] arr; // ๊ฐ ํ์ ํธ์ด ๋์ธ ์ด์ ์ธ๋ฑ์ค ์ ์ฅ
static int sum; // ํธ์ ๋ฐฐ์นํ๋ ๋ฐฉ๋ฒ์ ์
public static void dfs(int start, int n) {
// ์ข
๋ฃ ์กฐ๊ฑด : ๋ชจ๋ ํ์ ํธ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐฐ์นํ๋ค๋ฉด
if (start == n) {
sum += 1;
return;
}
for (int i = 0; i < n; i++) {
boolean check = true; // ํ์ฌ ์ด์ ํธ์ ๋์ ์ ์๋ ์ง์ ๋ํ ์ฌ๋ถ
for (int j = 0; j < start; j++) {
// ๊ฐ์ ์ด์ ํธ์ด ์๋ ์ง
// ์ผ์ชฝ ๋ฐฉํฅ ๋๊ฐ์ ์ ํธ์ด ์๋ ์ง
// ์ค๋ฅธ์ชฝ ๋ฐฉํฅ ๋๊ฐ์ ์ ํธ์ด ์๋ ์ง
if (arr[j] == i || arr[j] + (start - j) == i || arr[j] - (start - j) == i) {
check = false;
break;
}
}
if (check) {
arr[start] = i;
dfs(start + 1, n);
}
}
}
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
int T;
T=sc.nextInt();
for(int test_case = 1; test_case <= T; test_case++)
{
int n = sc.nextInt();
sum = 0;
arr = new int[n];
dfs(0,n);
System.out.println("#" + test_case + " " + sum);
}
sc.close();
}
}