N-Queen
๐ซ N-Queen
n*n ์ฒด์คํ์์ n๊ฐ์ ์ฌ์์ ์๋ก ๊ณต๊ฒฉํ ์ ์๋๋ก ๋ฐฐ์นํ๋ ๋ฌธ์
์ด๋ค ๋ ์ฌ์๋ ๊ฐ์ ํ, ๊ฐ์ ์ด, ๊ฐ์ ๋๊ฐ์ ์์ ์์นํ ์ ์์
โ N x N ๋ณด๋์์, ์๋ก ์ํฅ์ ์ค ์ ์๋ ์ฒด์ค ์ฌ์ ๋ฐฐ์น ๊ฒฝ์ฐ์ ์
n์ด 4์ด์์ผ ๋๋ง ํด๊ฐ ์กด์ฌ
@ NQ_0000, 8-์ฌ์ ๋ฌธ์ ํด๋ต ์
๐ซ Solve By BackTracking
๐ซง ์ํ ๊ณต๊ฐ ํธ๋ฆฌ
๊ฐ์ ์ค์ ๋ ์ฌ์์ ๋ฐฐ์นํ ์ ์์
โ ์ฒซ ๋ฒ์งธ ์ค๋ถํฐ ํ ์ค์ ํ ์ฌ์๋ง ์์ ์ ์์
1~n๋ฒ ํ ์์๋๋ก ์ฌ์์ด ์ด๋ ์์นํ๊ณ ์๋์ง ์ ์ฅํ์ฌ ํธ๋ฆฌ ๊ตฌ์ฑ
@ NQ_0001, ๊ฒฝ์ฐ์ ์ ์ฒด์คํ ๋ณด๋ ์์ (Start์ผ๋ก๋ถํฐ 4๊ฐ์ ์ฒด์คํ, โฆ)
๊ฐ ์ฌ์์ ์ขํ๋ (1, 3), (5, 3) ์ด๋ฐ์์ผ๋ก ํํ ๊ฐ๋ฅ
@ NQ_0002, Start ๋
ธ๋์์ ์์ํด์ ์ญ ๋ด๋ ค๊ฐ๋, ๊ฐ ๋
ธ๋์ ์ขํ๋ฅผ ์ ์ ์ํ ๊ณต๊ฐ ํธ๋ฆฌ ์์
@ ์ต์ข
์ํ ์ฒด์คํ ๋ณด๋ ์์ (์ ๋ต์ด ์๋ ๊ฒฝ์ฐ๋ ์๊ณ , ์ ๋ต์ธ ๊ฒฝ์ฐ๋ ์๊ณ )
์ ๋งํ์ง ์๋ค = ๊ฒน์น๋ ๊ฒฝ์ฐ๊ฐ ์๋ค = (ํ์ด ๊ฒน์น๋ค, ์ด์ด ๊ฒน์น๋ค, ๋๊ฐ์ ์ผ๋ก ๊ฒน์น๋ค)
@ NQ_0003, ๋ด๋ ค๊ฐ๋ค๊ฐ ์ ๋งํ์ง ์์ ๋ ธ๋์๋ x ํ์ํ๊ณ ๋์ด๊ฐ, ์ํ ๊ณต๊ฐ ํธ๋ฆฌ ์์
n-์ฌ์ ๋ฌธ์ ๋ ํด๋ต์ด ์ฌ๋ฟ ์์ ์ ์์ผ๋ฏ๋ก ์ํ ๊ณต๊ฐ ํธ๋ฆฌ๋ฅผ ๋ชจ๋ ๋ค์ ธ์ผ ํ๋ค
๋ค์ง๋ ๋์ ๊ฐ ํ (๋ฐฐ์ด) ์ค๋ฅด๋ฝ ๋ด๋ฆฌ๋ฝํ๋ ๋ชจ์ต (์์ํ์ธ์)
๐ซง ์๊ณ ๋ฆฌ๋ฌ
Back-Tracking, ์ค์ ๋ก ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ง๋ ์๊ณ , ๊ฐ ๋ ๋ฒจ์ ํด๋นํ๋ ์ํ ์ ๋ณด๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
- ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ์ํ ๊ณต๊ฐ ํธ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ๊ธฐ์ตํด์ผ ํ ์ ๋ณด๋ โ๊ฑธ์ด์จ ๊ธธโ
- ๋ ๋ฒจ
i
๋ ธ๋๋i
๋ฒ์งธ ํ๊น์ง ๋์ธi
๊ฐ์ ์ฌ์ ์์น๋ฅผ ๊ธฐ์ตํด์ผ ํจ- ํด๋น ๋
ธ๋๊ฐ ์ ๋งํ์ฌ ์์ ๋
ธ๋๋ก ๋ด๋ ค๊ฐ๋ค๋ฉด, ๋ค์ ๋จ๊ณ์
i + 1
๊ฐ์ ์ฌ์ ์์น๋ฅผ ๊ธฐ์ต - ํด๋น ๋
ธ๋๊ฐ ์ ๋งํ์ง ์์ ๋ถ๋ชจ ๋
ธ๋๋ก ๋๋์๊ฐ๋ค๋ฉด, ๋ค์ ๋จ๊ณ์
i - 1
๊ฐ์ ์ฌ์ ์์น๋ฅผ ๊ธฐ์ต
- ํด๋น ๋
ธ๋๊ฐ ์ ๋งํ์ฌ ์์ ๋
ธ๋๋ก ๋ด๋ ค๊ฐ๋ค๋ฉด, ๋ค์ ๋จ๊ณ์
์ธ๋ฑ์ค | 1 | 2 | 3 | 4 |
์ด | 2 | 4 | 1 | 3 |
@ NQ_0004
- ๋ฐฐ์ด ์ธ๋ฑ์ค : ํ
- ๋ฐฐ์ด ๊ฐ : ํด๋น ํ์์ ๋์ธ ์ฌ์์ ์ด ์์น
โด n ๊ฐ์ ์ด์ ์ ์ฅํ ์ ์๋ 1์ฐจ์ ๋ฐฐ์ด์ด ํ์
- ์ํ ๊ณต๊ฐ ํธ๋ฆฌ์ ๋์ํ๋ ๋ฐฐ์ด ์ํ
- ๊ฐ ๋
ธ๋์ ํด๋นํ๋ ๋ฐฐ์ด์ ๊ฐ๋ค์ ๋ถ๋ถํด
- ์๋๋ก ์ด๋ํ๋ฉด ๋ค์ ์ธ๋ฑ์ค์ ๊ฐ์ ์ ์ฅํ๊ณ ์๋ก ์ด๋ํ๋ฉด ๋ง์ง๋ง์ ์ ์ฅ๋ ๋ฐฐ์ด ์์๋ ๋ฎ์ด์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅ โ ์ ์งํ ๋ ๊ธฐ์ตํ๊ณ ํ์งํ ๋ ๊ธฐ์ต์์ ์ง์
- ๊ฐ ๋
ธ๋์ ํด๋นํ๋ ๋ฐฐ์ด์ ๊ฐ๋ค์ ๋ถ๋ถํด
@ NQ_0005, ์ํ๊ณ ๊ฒฝ์ฐ์ ์ ์ฌ์ง
๐ซง ๊ตฌํ
QueenBT(0)
์ ํธ์ถํจ์ผ๋ก์จ ์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void QueenBT(int i) // ๋
ธ๋๊ฐ ์๋๋ผ ๋ ๋ฒจ, ๋ ๋ฒจ์ ๋ํ ์ฒ๋ฆฌ
{
if (!Promising(i)) // ์ ๋งํ์ง ์์ผ๋ฉด ํจ์ค
return;
// ๋ง์ง๋ง ํ์ด๋ฉด ๋
// ์ ๋ฐ๋ก ๋์ด๋๋ฉด, ์ ๋งํ ๋
ธ๋์ ๋ํด์๋ง ๊ฒ์ฌ๋ฅผ ํ๋๊น (์์์ ๊ฒ์ฌ)
if (i == n)
{
OutputSolution(i);
}
// ๋ง์ง๋ง ๋ ๋ฒจ์ด ์๋๋ฉด
// ์์ ๋
ธ๋๋ค์ ๋ํด์ ๊ฒ์ฌ
else
{
for (int col = 1; col <= n; col++)
{
column[i + 1] = col;
QueenBT(i + 1);
}
}
}
bool Promising(int i)
{
// ์ ๋งํ์ง ์์ ๊ฒฝ์ฐ
// 1. ๊ฐ์ ํ : ์๊ณ ๋ฆฌ๋ฌ ์ ๊ฒฝ์ฐ ์์
// 2. ๊ฐ์ ์ด : column[i] == column[j]
// 3. ๊ฐ์ ๋๊ฐ์ :
// ์๋ก๋ฅผ ์๋ ์ ๋ถ์ ๊ธฐ์ธ๊ธฐ๊ฐ 1 ๋๋ -1 = x ์ฐจ์ด ์ ๋๊ฐ๊ณผ y ์ฐจ์ด ์ ๋๊ฐ์ด ๋๊ฐ์
for (int j = 0; j < i; j++)
{
if (column[i] == column[j] || Math.Abs(column[i] - column[j]) == i - j)
return false;
}
return true;
}
๐ซง ๋ถ์
์ํ ๊ณต๊ฐ ํธ๋ฆฌ์ ๋ ธ๋ ์
\[1 + n + n^2 + ... + n^n = {(n^{n+1} - 1) \over (n-1)}\]์๊ณ ๋ฆฌ๋ฌ ์๊ฐ์, ์ํ ๊ณต๊ฐ ํธ๋ฆฌ์ ๋
ธ๋ ์์ ๋น๋ก (์ต์
์ ๊ฒฝ์ฐ ์ํ ๊ณต๊ฐ์ ๋ชจ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ)
4-Queen : 341๊ฐ, 8-Queen : 19,173,961๊ฐ
์ ๋งํ ๋ ธ๋ ์ ์ต๋/์ํ
\[1 + n + n(n-1) + n(n-1)(n-2) + ... + n!\]๊ฐ์ ์ด์ ๋ ์ฌ์์ ๋ฐฐ์นํ ์ ์์ผ๋ฏ๋ก, ์ํ ๊ณต๊ฐ ํธ๋ฆฌ์์ ๋ ๋ฒจ์ด ํ๋์ฉ ์ฆ๊ฐํ ์๋ก ์ ๋งํ ๋
ธ๋์ ์๋ ํ๋์ฉ ์ค์ด๋ฆ.
4-Queen : ์ต๋ 65๊ฐ, 8-Queen : ์ต๋ 109,601๊ฐ
์ค์ ๋ฐฉ๋ฌธํ๋ ๋ ธ๋์ ์ (N-Queen)
n | DFS (๋ชจ๋ ๋ ธ๋ ์) | Back-Tracking (์ค์ ๋ฐฉ๋ฌธ ๋ ธ๋ ์) | ์ ๋งํ ๋ ธ๋ ์ |
4 | 341 | 61 | 17 |
8 | 19,173,961 | 15,721 | 2,057 |
12 | 9.74 x 10^12 | 1.01 x 10^7 | 8.57 x 10^5 |
๐ซ Solve By Genetic-Alogrithms
์ ์ ์๊ณ ๋ฆฌ๋ฌ์ ๋ฌธ์ ์ ์ ์ฉํ๋ ๊ณผ์
- ์ธ์ฝ๋ฉ Encoding, ์ ํฉ๋ ํจ์
- ๋ฌธ์ ๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ๋ ๋ฐฉ์์ผ๋ก โ ๊ฐ ์ฌ์์ ์ขํ๋ฅผ ๋ฐฐ์ด๋ก ์ ์ฅ
- ์ ํฉ๋ ํจ์ โ ๊ฐ ์ฌ์์ด ๋ค๋ฅธ ์ฌ์๊ณผ ๊ฐ๋ก, ์ธ๋ก, ๋๊ฐ์ ์ผ๋ก ๋ง๋๋ ์ง
- ๋ชจ์ง๋จ ๊ตฌ์ฑ
- ์ ํฉ๋ ํ๊ฐ
- ์ ํฉ๋ ํจ์๋ฅผ ๋ฐํ์ผ๋ก ๊ณ์ฐํ ์ ์
- ๊ฐ Solution์ ์ ์๋ฅผ ์ ์ ์ดํฉ์ผ๋ก ๋๋ ๋น์จ์ ๋ฐํ์ผ๋ก ์์์ Solution ์ ํ
- ์ ํ (- ์ฌ์์ฐ์ ํ๊ธฐ ์ํด)
- ์ฌ์์ฐ โ ๊ต์ฐจ, ๋์ฐ๋ณ์ด
- i.e. ๋ค๋ฅธ Solution๊ณผ ์ผ์ ๋ฒ์ ์ฌ์์ ์ขํ ๊ต์ฒด, ํน์ ์ฌ์ ์ขํ ๋ณํ
- ๋ต์ ์ฐพ์ ๋ ๊น์ง ๋ฐ๋ณต