๐[๋ฐฑ์ค-9663] N-Queen ๋ฐฑํธ๋ํน(Java)
N-Queen ๋ฌธ์
N-Queen ๋ฌธ์ ๋ ํฌ๊ธฐ๊ฐ N ร N์ธ ์ฒด์คํ ์์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๋ฌธ์ ์ด๋ค.
N์ด ์ฃผ์ด์ก์ ๋, ํธ์ ๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๋ฐฑํธ๋ํน
์ด ๋ฌธ์ ๋ ๋ฐฑํธ๋ํน
์ ์ด์ฉํด์ ํ ์ ์๋ค.
๋ฐฑํธ๋ฆฌํน
์ด๋ โ๊ฐ๋ฅํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ํ์ํ๋คโ์ ์์ด๋์ด๋ฅผ ๊ฐ์ง๋ค.
์ฆ, ๋ฐฑํธ๋ํน์ ํ์ฌ ์ํ์์ ๊ฐ๋ฅํ ๋ชจ๋ ํ๋ณด๊ตฐ์ ๋ฐ๋ผ ๋ค์ด๊ฐ๋ฉฐ ํด๊ฒฐ์ฑ
์ ๋ํ ํ๋ณด๋ฅผ ๊ตฌ์ถํด ๋์๊ฐ๋ค ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ฐ ํ๋จ๋๋ฉด ์ฆ์ ํ๋ณด๋ฅผ ํฌ๊ธฐํ๋ฉด์ ์ ๋ต์ ์ฐพ์๊ฐ๋ ๋ฒ์ฉ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
**โํน์ ์กฐ๊ฑดโ์ ๋ง์กฑํ๋ โ๋ชจ๋ ๊ฒฝ์ฐ์ ์โ๋ฅผ ์ฐพ์ ๋ ์ฉ์ดํจ!**
๋ฐฑํธ๋ํน์ ๊ฐ์ง์น๊ธฐ๋ก ๋ฌธ์ ๋ฅผ ํ๋ฉด, ๋ถํ์ํ ์ฌ๊ทํธ์ถ์ ์ํํ์ง ์์ ํจ์ฌ ํจ์จ์ ์ผ๋ก ๋ต์ ๊ตฌํ ์ ์๋ค.
์
๋ ฅ์ ๋ฐ์ ๋์๋ 2์ฐจ์ ๋ฐฐ์ด์ ์๊ฐํ๊ธฐ ์ฝ์ง๋ง, 1์ฐจ์ ๋ฐฐ์ด๋ก ํด๊ฒฐํ๋ค๋ฉด ์๊ฐ์ด ๋ ์ ์ฝ๋๋ค.
(0,2), (1,0), (2,3), (3,1) ์ฒ๋ผ ์ ์ฅํ์ง ์๊ณ , ์ ์ฌ์ง์ฒ๋ผ (2,0,3,1)์ฒ๋ผ ํธ์ด ๋์ธ ์ด(row)
์ ์์น๋ง ์ ์ฅํด๋ ์ถฉ๋ถํ๋ค.
์ด์ ๋ ํธ์ ์ด์ด ๊ฐ๋ค๋ฉด ๋ค๋ฅธ ํธ์ด ๊ณต๊ฒฉํ ์ ์์ผ๋๊น!
๋ฐฑํธ๋ํน ์ ์ฐจ
DFS ์ํ - ์ ๋งํ ๋ ธ๋ ๊ฒํ - ์๋ธ ํธ๋ฆฌ ์ด๋ - ๋ฐฑํธ๋ํน ์ํ
- DFS ์ํ
์๋๋๋ก ์ฌ๊ท ํธ์ถ์ ์ด์ฉํด์ ๊ณ์ ์ด๋ํ๋ DFS๋ฅผ ์ํํ์ฌ ๋ ธ๋๋ฅผ ์ฐพ๋๋ค. - ์ ๋งํ ๋
ธ๋ ๊ฒํ
๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ํฌํจํด์ ์ ๋งํ ๋ ธ๋์ด๋ฉด ์๋ธํธ๋ฆฌ๋ก ์ด๋ํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฐฑํธ๋ํน์ ์ํํ๋ค. - ์๋ธ ํธ๋ฆฌ ์ด๋
๋ฐฉ๋ฌธํ ๋ ธ๋์ ํ์ ๋ ธ๋๋ก ์ด๋ํ์ฌ ๋ค์ ์ฌ๊ท๋ฅผ ํตํด DFS๋ฅผ ์ํํ๋ค. - ๋ฐฑํธ๋ํน ์ํ
๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ๊ฐ์ง์น๊ธฐํ๊ณ ์์ ๋ ธ๋๋ก ๋ฐฑํธ๋ํน ํ ํ DFS๋ฅผ ๋ค์ ์ํํ๋ค.
N-Queen ๋ฐฑํธ๋ํน ์ด์ฉํด์ ํ๊ธฐ
์ฒด์ค์์ ํธ์ ์ง์ ๊ณผ ๋๊ฐ์ ๋ชจ๋ ๋ฐฉํฅ์ผ๋ก ๋ชจ๋ ์นธ์ ์์ ์์ ๋ก ์ด๋ํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ํธ๋ผ๋ฆฌ ๋๋๋ฐ, ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ํ๋ ค๋ฉด ์ฒด์คํ์ ํ ์ค์๋ ํ๋์ ํธ๋ง ์กด์ฌํ๊ฒ ๋๋ค!
๊ทธ๋ฌ๋ฉด, 1๋ฒ์งธ ์ค์ ํธ ํ๋๋ฅผ ๋๊ณ ๋ค์ ์ค๋ก ๋์ด๊ฐ โ์กฐ๊ฑด์ ๋ง๊ฒโ ํธ์ ๋ค์ ๋๊ณ , ๋ค์ ๋ค์ ์ค๋ก ๋์ด๊ฐ โ์กฐ๊ฑด์ ๋ง๊ฒโ ํธ์ ๋ ๋๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ฉด ๋๊ฒ ๋ค.
[Java]์ฝ๋
package Baekjoon_sds.์๊ณ ๋ฆฌ์ฆ_๊ธฐ์ด;
import java.util.Scanner;
// N-Queen
// 1. ํธ๊ณผ ์ธ์ ํ ์นธ์๋ ๋ค๋ฅธ ํธ์ด ์์ผ๋ฉด ์๋จ -> ๊ฒ์ฌ ํ์
// 2. ์์ ํ ๊ณณ์ ํธ ๋ฐฐ์น
public class N_Queen {
public static void main(String[] args) {
int N;
int[] cols;
Scanner scanner = new Scanner(System.in);
System.out.print("");
N = scanner.nextInt();
cols = new int[N];
Queen queen = new Queen(N, cols);
for (int i = 0; i < N; i++) {
queen.back_tracking(i);
}
}
}
class Queen {
int N;
int cols[];
public Queen(int n, int[] cols) {
N = n;
this.cols = cols;
}
public void back_tracking(int level) {
if (level == N) {
for (int i = 0; i < N; i++) {
System.out.print(cols[i]);
}
System.out.println();
} else {
for (int i = 0; i < N; i++) {
cols[level]=i;
if (isPossible(level)) {
back_tracking(level+1);
}
}
}
}
public boolean isPossible(int level) {
for (int i = 0; i < level; i++) {
if (cols[i] == cols[level] || Math.abs(level - i) == Math.abs(cols[level] - cols[i])) {
return false;
}
}
return true;
}
}
[Python]์ฝ๋
def adjacent(x): # x์ i ๊ฐ ๊ฐ์ผ๋ฉด ํ์ด ๊ฐ์๊ฑฐ ๊ทผ๋ฐ for๋ฌธ์ ๋ณด๋ฉด x์ i๊ฐ ๊ฐ์ ์๊ฐ ์๋ค.
for i in range(x): #์ธ๋ฑ์ค๊ฐ ํ row[n]๊ฐ์ด ์ด
if row[x] == row[i] or abs(row[x] - row[i]) == x - i: # ์ด์ด ๊ฐ๊ฑฐ๋ ๋๊ฐ์ ์ด ๊ฐ์ผ๋ฉด false
return False # ๋๊ฐ์ ์ด ๊ฐ์๊ฒฝ์ฐ๋ ๋ ์ขํ์์ ํ - ํ = ์ด - ์ด ์ด ๊ฐ์ผ๋ฉด ๋๊ฐ๋ ๊ฐ์ ๋๊ฐ์ ์์ ์๋ค.
return True
#ํ์ค์ฉ ์ฌ๊ทํ๋ฉฐ dfs ์คํ
def dfs(x):
global result
if x == N:
result += 1
else:
# ๊ฐ ํ์ ํธ ๋๊ธฐ
for i in range(N): # i ๋ ์ด๋ฒํธ 0๋ถํฐ N ์ ๊น์ง ์ฎ๊ฒจ๊ฐ๋ฉด์ ์ ๋งํ๊ณณ ์ฐพ๊ธฐ
row[x] = i
if adjacent(x): # ํ,์ด,๋๊ฐ์ ์ฒดํฌํจ์ true์ด๋ฉด ๋ฐฑํธ๋ํน ์ํ๊ณ ๊ณ์ ์งํ
dfs(x + 1)
# N = int(input())/
N = int(input())
row = [0] * N
result = 0
print(row)
dfs(0)
# print(row)
print(result)
๋๊ธ๋จ๊ธฐ๊ธฐ