๋ฌธ์
N-Queen ๋ฌธ์ ๋ ํฌ๊ธฐ๊ฐ N × N์ธ ์ฒด์คํ ์์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๋ฌธ์ ์ด๋ค.
N์ด ์ฃผ์ด์ก์ ๋, ํธ์ ๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1 ≤ N < 15)
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ
8
์์ ์ถ๋ ฅ
92
ํด๊ฒฐ๋ฐฉ๋ฒ
N-Queen ๋ฌธ์ ๋ Backtracking ์ ๋ต์ ํตํด ํด๊ฒฐํ ์ ์๋ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฌธ์ ์ค ํ๋์ด๋ค.
Queen์ NxN ์ฒด์คํ์ N๊ฐ ๋๊ธฐ ์ํด์๋ ๊ฐ ํ์ ์ค์ง ํ๋์ ํธ๋ง์ด ์ฌ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฐฐ์ด์ ํ๋ ๋ง๋ค์ด์ ๊ฐ ํ์ ํธ์ ์์น๋ฅผ ๊ธฐ๋กํ ์ ์๋๋ก ํ๋ค.
๊ฐ ํ๋ค์ ๋ํด ํธ ์์น๋ฅผ ๋ชจ๋ ํ์ํ๋, ์กฐ๊ฑด์ ๋ง์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๊ทธ ์ดํ๋ ๊ณ ๋ คํ์ง ์๊ณ ๊ฐ์ง์น๊ธฐ๋ฅผ ํด๋ด ๊ฒฝ์ฐ์ ์๋ฅผ ์ค์ธ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ๋จ๊ณ๋ก ๋๋์๊ฐ ํ์์ ๊ณ์ ์ํํ๋ค.
์ ๋ต์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ๋ก๋ง์ ํ์ํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ผ๋ก ๋์ํ ์ ์๋ค.
n๋ฒ์งธ ํ์ ์ต์ข ์ ์ผ๋ก ํธ์ ๋ฐฐ์นํ๊ณ ๊ณต๊ฒฉ๋ฐ๋ ์ํ๊ฐ ์๋๋ผ๋ฉด ์ ๋ต ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
import sys
# ์ฒด์คํ์ ํฌ๊ธฐ๋ฅผ ์
๋ ฅ๋ฐ์
n = int(input())
# ํ์ฌ ๋ฐฐ์นํ ํธ์ด ์ด์ ์ ๋ฐฐ์นํ ํธ๋ค๊ณผ ์ถฉ๋ํ๋์ง ํ์ธ
def attack(x):
for i in range(x):
# ๊ฐ์ ์ด์ ์๊ฑฐ๋, ๋๊ฐ์ ์์ ์์ผ๋ฉด ์ถฉ๋์
if row[x] == row[i] or abs(row[x] - row[i]) == abs(x - i):
return True
return False
# start๋ ํ์ฌ ๋๊ณ ์๋ ํ
def dfs(start):
global cnt
๋ชจ๋ ํ์ ํธ์ ๋ฐฐ์นํ๋ค๋ฉด ์ ํจํ ๋ฐฐ์น์ด๋ฏ๋ก cnt ์ฆ๊ฐ
if start == n:
cnt += 1
else:
for i in range(n):
row[start] = i
# ์ถฉ๋์ด ์๋ค๋ฉด ๋ค์ ํ์ ์งํ
if not attack(start):
dfs(start + 1)
# ๊ฐ ํ์ ํธ์ ์ ์ฅํ ๋ฆฌ์คํธ ์ด๊ธฐํ
row = [0] * n
# ๊ฐ๋ฅํ ๊ฐ์ง์๋ฅผ ์ธ๋ ๋ณ์ ์ด๊ธฐํ
cnt = 0
dfs(0)
print(cnt)
'๐์ฝ๋ฉํ ์คํธ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 9251 - LCS (Python) (0) | 2024.08.22 |
---|---|
[๋ฐฑ์ค] 2206 - ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ (Python) (0) | 2024.08.21 |
[๋ฐฑ์ค] 1916 - ์ต์ ๋น์ฉ ๊ตฌํ๊ธฐ (Python) (0) | 2024.08.19 |
[๋ฐฑ์ค] 11404 - ํ๋ก์ด๋ (Python) (0) | 2024.08.19 |
[๋ฐฑ์ค] 1504- ํน์ ํ ์ต๋จ ๊ฒฝ๋ก (Python) (0) | 2024.08.19 |