[BOJ][๐ก4][๋ฐฑ์ค#09663] N-Queen
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
N-Queen ๋ฌธ์ ๋ย ํฌ๊ธฐ๊ฐ N ร N์ธ ์ฒด์คํ ์์ ํธ N๊ฐ๋ฅผย ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ย ๋ฌธ์ ์ด๋ค. N์ด ์ฃผ์ด์ก์ ๋, ํธ์ ๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N < 15)
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ย ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
8
์ถ๋ ฅ
92
My Sol
def main(i):
global N, V
if i==N-1:
for j in range(N):
if j in V: continue
if j-i in R: continue
if j+i in L: continue
return 1
return 0
cnt = 0
for j in range(N):
if j in V: continue
if j-i in R: continue
if j+i in L: continue
V.add(j)
R.add(j-i)
L.add(j+i)
cnt += main(i+1)
V.remove(j)
R.remove(j-i)
L.remove(j+i)
return cnt
N = int(input())
V, R, L = set(), set(), set()
print(main(0))
pypy๋ก ํ์ด์ผ ์๊ฐ ์ด๊ณผ๊ฐ ๋์ง ์๋ ๋ฐฉ์์ด์๋ค. ํด์๋ฅผ ํ์ฉํ ๋ฐฑํธ๋ํน๊ณผ ๋ธ๋ฃจํธํฌ์ค๋ฅผ ์ฌ์ฉํ์๋ค.
- ์ธ๋ก์ด, ์ค๋ฅธ์ชฝ ์ ๋๊ฐ์ , ์ผ์ชฝ ์ ๋๊ฐ์ ์ ๊ฐ๊ฐ V, R, L์ set์ผ๋ก ๋์๋ค.
- queen์ ๋๊ฒ ๋๋ฉด ํด๋น j, j+i, j-i์ ๊ฐ์ ํด๋นํ๋ ์์น๋ฅผ ๋ ๋ ์ ์๋ค๋ ์ฑ์ง์ ํ์ฉํด set์ ๋ฃ์ด in ์ฐ์ฐ์๋ก ํ์ธํ์๋ค.
- dfs๋ก ์ฌ๊ท์ ์ผ๋ก ๊ฒฝ์ฐ์ ์๋ฅผ ๋ํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
#9663(N-Queen)
n=int(input())
count=0
row,left,right=[0 for _ in range(n)],[0 for _ in range(2*n-1)],[0 for _ in range(2*n-1)]#์์ง,์ผ์ชฝ๋๊ฐ์ ,์ค๋ฅธ์ชฝ ๋๊ฐ์
#์ธ๋ฑ์ค์ ํฉ๊ณผ ์ฐจ๊ฐ ๊ฐ์ ๋๊ฐ์ ์์ ์์๋ ๊ฐ๋ค๋ ๊ฒ์ ์ด์ฉํจ
#ex)0,2๊ณผ 1,1๊ณผ 2,0์ ๊ฐ์ ๋๊ฐ์ ์์ ์์นํ๋ค. ๊ฐํ์ด์ ํฉ์ด ๊ฐ์๊ฒ์ ์์์๋ค.
def Q(i):
global count
if i==n: #๋๊น์ง ํธ์ ๋ฃ์ผ๋ฉด
count+=1
return
for j in range(n): #์ด์ ์ด๋ํ๋ฉฐ
if row[j] + left[i+j] + right[n-1+i-j]==0: #์ธ์กฐ๊ฑด์ ๊ฑธ๋ฆฌ์ง ์๋๋ค๋ฉด
row[j]=left[i+j]=right[n-1+i-j]=1
Q(i+1)
row[j]= left[i+j]= right[n-1+i-j] = 0#์ด๊ธฐํ
Q(0)
print(count)
set์ด ์๋ list์ ์ธ๋ฑ์ค์ ๋ฐ๋ฅธ 0/1 ์ฒดํฌ๋ก ์กฐ๊ฑด์ ํ์ธํ๋ ๋ฐฉ์์ด๋ค. ํ ๋ฒ์ 0, 1๋ก ์กฐ๊ฑด ์ฒดํฌ ๋ฐ ์ด๊ธฐํํ๋ ๋ฐฉ์์ธ๋ฐ ์ ์ฐ์ฐ์๋๊ฐ ๋ ๋น ๋ฅธ์ง๋ ์ ์๊ฐ ์๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ