[๋ฐฑ์ค] [Python] ๐งฉ N-Queen (Easy) 30242๋ฒ
๐ก ๋ฌธ์ ์ค๋ช

์ ์ ํ๋ ๋ฌธ์ ์ ๋ค๋ฅด๊ฒ, ์ด๋ฏธ ํธ์ด ๋์ฌ์ ธ ์์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ , ํ๋ฒ์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ผ๋ ํธ๋ค์ ์๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ ๋ฌธ์ ๋ค.
์ ํ์ ์ธ ๋ฐฑํธ๋ํน ๋ฌธ์ ๋ก, ์ด ๋ฌธ์ ๋ ๊ผญ ํ์ด๋ณด๋ฉด ์ข๋ค.
๐ก ๋๋ฆฐ ํ์ด (ํต๊ณผ๋ ๋ฐ์)
์ด ํ์ด๋ฒ์ ๋ณดํต ๋ฐฑํธ๋ํน์ ํตํด n-queen์ ํผ๋ค๋ฉด ํธ๋ ๋ฐฉ์์ด๋ค.
๋์ ์ ํด์ค ํ checkํ ๋๋ง๋ค ๊ฐ๋ก, ์ธ๋ก, ๋๊ฐ์ ์ ๊ฒน์น๋๊ฒ ์๋์ง ํ์ธํด์ค๋ค.
์ฌ๊ธฐ์ quit() ๋ ์์ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์์ผ์ค๋ค.
import sys
def q_check(x):
# ์ด๋ฏธ ๊ธฐ๋ก๋ 0 ~ N ๋ฒ์ ๋ณด๊ธฐ
for i in range(N):
# ๋ณธ์ธ ๋จ๊ณ ์ ์ธ
if i==x:
continue
# ์์ง ์์ด๊ฑฐ๋ ๋๊ฐ์ ์ํฅ๊ฐ์์์ผ๋ ์ ์ธ
if row[i]==0:
continue
# row (๊ฐ๋ก)์ฒดํฌ
# ์ฒดํฌํ๋ ค๋ row == ๊ธฐ๋ก๋ row(q_list[i]) ์ผ๋ False
if row[x] == row[i]:
return False
# ๋๊ฐ์ ์ฒดํฌ
# ์ฒดํฌํ๋ ค๋ row ์ ์ด๋ฏธ ๊ธฐ๋ก๋ row ์ ์ฐจ๊ฐ
# ์ฒดํฌํ๋ ค๋ column ๊ณผ ๊ธฐ๋ก๋ column ์ ์ฐจ๋ ๊ฐ๋ค๋ฉด ๋๊ฐ์ ์ด๋ False
if abs(row[x]-row[i]) == abs(x-i): # abs() = ์ ๋๊ฐ ํจ์
return False
# ๋ ๊ฒฝ์ฐ ๋ค ํผํด๊ฐ๋ฉด True
return True
def n_queen(n):
# ๋๊น์ง ์์ฑํ ๊ฒฝ์ฐ
if n==N:
print(*row)
quit() # ์์ ์ข
๋ฃ
# ์ด๋ฏธ ์จ์๋๊ฒฝ์ฐ ๋ฐ๋ก ๋ค์๋จ๊ณ๋ก
if row[n]!=0:
n_queen(n+1)
return
# 1๋ถํฐ N๊น์ง ๋ฃ์ด๋ณด๊ธฐ
for i in range(1,N+1):
# ํด๋น ์ซ์๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋๋ง ๋ฃ๊ธฐ
if visited[i] == False:
temp = row[n]
row[n] = i
if q_check(n):
visited[i]=True
n_queen(n+1)
visited[i]=False
row[n] = temp
N = int(sys.stdin.readline())
row = list(map(int, sys.stdin.readline().split()))
visited = [False] * (N+1)
# ์ด๋ฏธ ๋์์ง ํธ์ ๊ฐ
for i in range(N):
if row[i] != 0:
visited[row[i]] = True
n_queen(0) # 0๋ฒ์งธ ์ค๋ถํฐ ํจ์ ์คํ
print(-1)
๐ก ๋ ๋น ๋ฅธ ํ์ด๋ฒ
์ด์ ์ ๊ธ์ ๋ณด๋ฉด ์ ์ ์์ง๋ง, ํ์ธํ๋ ๊ณผ์ ์์ for๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ , ๋ฐ๋ก ํ์ธ ํ ์ ์๋ค.
์ด์ ์ ๊ธ์ ๋ณด์ง ์์๋ค๋ฉด ์๋๋ก ๋ด๋ ค๊ฐ ์ค๋ช ์ ๋ณด์.
import sys
def backtracking(n):
# ๋ค ๋๋ฌํ์ ๋
if n==N:
print(*arr)
quit()
# ์ด๋ฏธ ์จ์๋๊ฒฝ์ฐ ๋ฐ๋ก ๋ค์๋จ๊ณ๋ก
if arr[n] != 0:
backtracking(n + 1)
return
for i in range(N):
# ๋์ ์ ์์ผ๋ฉด
if row[i] and x1[i+n] and x2[i+((N-1)-n)]:
arr[n] = i+1
row[i]=False # ๊ฐ๋ก์ค ์ ๊ฑฐ
x1[i+n]=False # ์ค๋ฅธ์ชฝ ์ ๋ฐฉํฅ ๋๊ฐ์ ์ ๊ฑฐ
x2[i+((N-1)-n)]=False # ์ค๋ฅธ์ชฝ ์๋ ๋ฐฉํฅ ๋๊ฐ์ ์ ๊ฑฐ
# ์์ ๋
ธ๋๋ก ์ด๋
backtracking(n+1)
# ๋ฐฑํธ๋ํน
row[i]=True
x1[i+n]=True
x2[i+((N-1)-n)]=True
arr[n] = 0
N = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
row = [True]*N # ๊ฐ๋ก
x1 = [True]*(2*N) # ์ ์ผ ์ผ์ชฝ์ด ์ธ๋ฑ์ค์ธ ์ฐ์ํฅ ๋๊ฐ์
x2 = [True]*(2*N) # ์ ์ผ ์ค๋ฅธ์ชฝ์ด ์ธ๋ฑ์ค์ธ ์ฐํํฅ ๋๊ฐ์
for i in range(N):
if arr[i] != 0:
row[arr[i]-1] = False # ๊ฐ๋ก์ค ์ ๊ฑฐ
x1[arr[i]-1 + i] = False # ์ค๋ฅธ์ชฝ ์ ๋ฐฉํฅ ๋๊ฐ์ ์ ๊ฑฐ
x2[arr[i]-1 + ((N - 1) - i)] = False # ์ค๋ฅธ์ชฝ ์๋ ๋ฐฉํฅ ๋๊ฐ์ ์ ๊ฑฐ
backtracking(0)
print(-1)
โrow[] : ๊ฐ๋ก ์ค
row๋ ๊ฐ๋จํ๊ฒ ๊ฐ๋ก์ ๊ฒน์น๋๊ฒ ์์ผ๋ฉด ์๋๋ฏ๋ก, ํด๋น row๋ฅผ ์ฌ์ฉํ์ผ๋ฉด False๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
โx2[] : ์ฐํํฅ ๋๊ฐ์
x2
๋ ์ค๋ฅธ์ชฝ ์๋๋ก ๊ฐ๋ ๋๊ฐ์ ์ ๋ปํ๊ณ , ์ด 2*N ๊ฐ๊ฐ ๋์ฌ ์ ์๋ค.
๊ฐ ๋๊ฐ์ ๋ค์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ๊ฐ์๋ index๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์๋ค.
๊ทธ๋ฆผ์ 0, 1 ๋จ๊ณ๋ฅผ ๋ง์น๊ณ 2๋จ๊ณ์ for๋ฌธ์์ i=3์ผ๋ ์ฐํํฅ ๋๊ฐ์ ์ด ๊ฒน์น์ง ์๋์ง๋ฅผ ๋ณด๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด n ๋จ๊ณ์ for๋ฌธ์ i๋ฒ์งธ row์ผ๋ ์๊ธฐ๋ ์ฐํํฅ ๋๊ฐ์ ์ ๋งจ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ฉด
i + (๋ง์ง๋ง ๋จ๊ณ - ์ง๊ธ ๋จ๊ณ)
๊ฐ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋์์๋๋
x2[i+((N-1)-n)] = False ๋ก ๋ฐ๊ฟ์ฃผ์ด ๋๊ฐ์ ์ด ์ฌ์ฉ๋์์์ ๋ํ๋ด๋ฉด ๋๋ค.
๋ค์ด๊ฐ ์ ์๋์ง ์ฒดํฌํ ๋๋
x2[i+((N-1)-n)] ๊ฐ True๋ฉด ๊ฒน์น์ง ์๊ณ , False๋ฉด ๊ฒน์ณ์ ๋ถ๊ฐ๋ฅ ํ๊ฒ์ด๋ค.
โx1[] : ์ฐ์ํฅ ๋๊ฐ์
x2๋ฅผ ์ดํดํ๋ค๋ฉด x1์ ์๋์ผ๋ก ์ดํด๋๋ค.
์ฐจ์ด์ ์ x2๋ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ด ๊ธฐ์ค์ด์๋ค๋ฉด, x1์ ๊ฐ์ฅ ์ผ์ชฝ์ด ๊ธฐ์ค์ด๋ค.
๊ทธ๋ ๋ค๋ฉด n ๋จ๊ณ์ for๋ฌธ์ i๋ฒ์งธ row์ผ๋ ์๊ธฐ๋ ์ฐ์ํฅ ๋๊ฐ์ ์ ๋งจ ์ผ์ชฝ์ผ๋ก ๊ฐ๋ฉด
i + (์ง๊ธ ๋จ๊ณ)
๊ฐ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋์์๋๋
x1[i+n] = False ๋ก ๋ฐ๊ฟ์ฃผ์ด ๋๊ฐ์ ์ด ์ฌ์ฉ๋์์์ ๋ํ๋ด๋ฉด ๋๋ค.
๋ค์ด๊ฐ ์ ์๋์ง ์ฒดํฌํ ๋๋
x1[i+n] ๊ฐ True๋ฉด ๊ฒน์น์ง ์๊ณ , False๋ฉด ๊ฒน์ณ์ ๋ถ๊ฐ๋ฅ ํ๊ฒ์ด๋ค.
๐ก ์ ์ถ ๊ฒฐ๊ณผ
์๋์ ํ์ด๊ฐ ๋๋ ธ๋ ์ฒซ๋ฒ์งธ ๋ฐฉ์์ด๊ณ , ์์ ํ์ด๊ฐ ๋ ๋น ๋ฅธ ํ์ด์ด๋ค.

๐ก ๋ง๋ฌด๋ฆฌ
์ง๋๋ฒ์ N-Queen ๋ฌธ์ ๋ณด๋ค ์ฌ๋ฏธ์์๋ค. ๋ฏธ๋ฆฌ ๋์ Queen์ ๊ฐ์ ๋ฐ๋ ์ ์ด ํฅ๋ฏธ๋ก์ ๊ณ ,
ํ๋์ ๋ต๋ง ๋์ค๋ฉด ์ถ๋ ฅํด์ฃผ์ด์ ์ค๋ฅ๊ฐ ์์ ๋ ์ด๋์ ๋ฐ์ํ๋์ง ๋ณด๊ธฐ ํธํ๋ค.
๋์ค์ ๐งฉ N-Queen (Hard) ๋ฅผ ํ์ด๋ณด๊ฒ ๋ค. (์ฐธ๊ณ ๋ก C++๋ก ํ์๋ค.)