๐ณ ๋งํฌ
๐ ๋ฌธ์
N-Queen ๋ฌธ์ ๋ ํฌ๊ธฐ๊ฐ N ร N์ธ ์ฒด์คํ ์์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๋ฌธ์ ์ด๋ค.
N์ด ์ฃผ์ด์ก์ ๋, ํธ์ ๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐พ ํ์ด ๋ฐฉ๋ฒ
n_queen ํจ์๋ฅผ ์คํ์ํฌ ๋์๋ ์ด์ ์ด์ฉํด์ ์คํ์ํค๊ณ , ๋ค์ด๊ฐ ์์๋๋ก๋ฅผ ํ์ผ๋ก ๋ฐฐ์ ํ์ฌ ๊ฐ์ ์ด์ ์๋ ๋ ธ๋์ ๋๊ฐ๋ ธ๋๋ฅผ ์ ์ธํ๋ค.
์๋ฅผ ๋ค์๋ฉด, n=4์ธ ๊ฒฝ์ฐ
0,1,2,3 ์์ผ๋ก n_queen
ํจ์๋ฅผ ์คํ์ํค๊ฒ ๋๋ค.
์ด๋ arr
์ [0,1] ์ด ๋ค์ด๊ฐ์๋ค๋ฉด, ์ด๋ (0,0), (1,1)
์ ํธ์ด ๋์ฌ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ฐ๋ผ์ n_queen
ํจ์ ๋ด์์ ๊ฐ์ ์ด์ ์์น ์ฆ, ํ์ฌ arr๊ฐ๊ณผ ๊ฐ์ ๊ฐ์ด๋ฉด ์ ์ธํ๊ณ distance๋ฅผ ๊ตฌํด์ ๋๊ฐ๋
ธ๋๋ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์์ค์ฝ๋ (Pypy3)
import sys
def n_queen(arr, n):
global count
if len(arr) == n:
count += 1
return
candidate = list(range(n)) #n=4์ธ ๊ฒฝ์ฐ, candidate=[0,1,2,3]
for i in range(len(arr)): #i๋ ์ด์ฉ๋ฉด ํ ๋ฒํธ
if arr[i] in candidate:
candidate.remove(arr[i])
dist = len(arr) - i
# arr[i]๊ฐ ์๋ len(arr)๋ก ํ๋ ์ด์ ๋, ๋ค์ ์ฐจ๋ก์ ๋ค์ด๊ฐ ์นธ์ด ํ์ฌ ๋ค์ด๊ฐ์๋ ํ๊ธธ์ด ๋ค์ ๋ค์ด๊ฐ์ผํ๋ฏ๋ก, ๋๊ฐ์ ์ ์ฐจ๊ฐ ๊ทธ๋งํผ ๋์ผํ๋ค.
# ์๋ฅผ ๋ค์ด์ ํ์ฌ (0,0)๋ง arr์ ์๋ ๊ฒฝ์ฐ์๋ ๋ค์์ ๋์ผ ํธ์ 1ํ์ ๋ค์ด๊ฐ๊ฒ ๋๋ฏ๋ก ๋๊ฐ์ ์ ํด๋นํ๋ ๊ฐ์ (1,1)๋ฐ์ ์์ผ๋ฏ๋ก dist=1
# ํ์ฌ (0,0) (1,2) ๊ฐ ๋ค์ด๊ฐ์๋ ๊ฒฝ์ฐ์๋ (0,0)์์ ํ์ธํ๋ ๊ฒฝ์ฐ๋ผ๋ ๋ค์์ ๋์ผ ํธ์ 2ํ์ ๋ค์ด๊ฐ๊ฒ ๋๋ฏ๋ก ๋๊ฐ์ ์ ํด๋นํ๋ ๊ฐ์ (2,2) ์ด๋ฅด๋ชจ dist = 2 (len(arr)-i)
if arr[i] + dist in candidate: #๊ฐ์ ๋๊ฐ์
candidate.remove(arr[i] + dist)
if arr[i] - dist in candidate:
candidate.remove(arr[i] - dist)
if candidate:
for c in candidate:
arr.append(c)
n_queen(arr,n)
arr.pop()
else:
return
count = 0
n = int(sys.stdin.readline().strip())
for i in range(n):
n_queen([i], n)
print(count)