๋ฌธ์ ์ค๋ช

์ ์ ํ๋ ๋ฌธ์ ์ ๋ค๋ฅด๊ฒ, ์ด๋ฏธ ํธ์ด ๋์ฌ์ ธ ์์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ , ํ๋ฒ์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ผ๋ ํธ๋ค์ ์๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ ๋ฌธ์ ๋ค.
์ ํ์ ์ธ ๋ฐฑํธ๋ํน ๋ฌธ์ ๋ก, ์ด ๋ฌธ์ ๋ ๊ผญ ํ์ด๋ณด๋ฉด ์ข๋ค.
๋๋ฆฐ ํ์ด (ํต๊ณผ๋ ๋ฐ์)
์ด ํ์ด๋ฒ์ ๋ณดํต ๋ฐฑํธ๋ํน์ ํตํด n-queen์ ํผ๋ค๋ฉด ํธ๋ ๋ฐฉ์์ด๋ค.
๋์ ์ ํด์ค ํ checkํ ๋๋ง๋ค ๊ฐ๋ก, ์ธ๋ก, ๋๊ฐ์ ์ ๊ฒน์น๋๊ฒ ์๋์ง ํ์ธํด์ค๋ค.
์ฌ๊ธฐ์ quit() ๋ ์์ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์์ผ์ค๋ค.
pythonimport 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๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ , ๋ฐ๋ก ํ์ธ ํ ์ ์๋ค.
์ด์ ์ ๊ธ์ ๋ณด์ง ์์๋ค๋ฉด ์๋๋ก ๋ด๋ ค๊ฐ ์ค๋ช ์ ๋ณด์.
pythonimport 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 + (๋ง์ง๋ง ๋จ๊ณ - ์ง๊ธ ๋จ๊ณ) ๊ฐ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋์์๋๋
pythonx2[i+((N-1)-n)] = False ๋ก ๋ฐ๊ฟ์ฃผ์ด ๋๊ฐ์ ์ด ์ฌ์ฉ๋์์์ ๋ํ๋ด๋ฉด ๋๋ค.
๋ค์ด๊ฐ ์ ์๋์ง ์ฒดํฌํ ๋๋
pythonx2[i+((N-1)-n)] ๊ฐ True๋ฉด ๊ฒน์น์ง ์๊ณ , False๋ฉด ๊ฒน์ณ์ ๋ถ๊ฐ๋ฅ ํ๊ฒ์ด๋ค.
x1[] : ์ฐ์ํฅ ๋๊ฐ์
x2๋ฅผ ์ดํดํ๋ค๋ฉด x1์ ์๋์ผ๋ก ์ดํด๋๋ค.
์ฐจ์ด์ ์ x2๋ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ด ๊ธฐ์ค์ด์๋ค๋ฉด, x1์ ๊ฐ์ฅ ์ผ์ชฝ์ด ๊ธฐ์ค์ด๋ค.
๊ทธ๋ ๋ค๋ฉด n ๋จ๊ณ์ for๋ฌธ์ i๋ฒ์งธ row์ผ๋ ์๊ธฐ๋ ์ฐ์ํฅ ๋๊ฐ์ ์ ๋งจ ์ผ์ชฝ์ผ๋ก ๊ฐ๋ฉด
i + (์ง๊ธ ๋จ๊ณ) ๊ฐ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋์์๋๋
pythonx1[i+n] = False ๋ก ๋ฐ๊ฟ์ฃผ์ด ๋๊ฐ์ ์ด ์ฌ์ฉ๋์์์ ๋ํ๋ด๋ฉด ๋๋ค.
๋ค์ด๊ฐ ์ ์๋์ง ์ฒดํฌํ ๋๋
pythonx1[i+n] ๊ฐ True๋ฉด ๊ฒน์น์ง ์๊ณ , False๋ฉด ๊ฒน์ณ์ ๋ถ๊ฐ๋ฅ ํ๊ฒ์ด๋ค.
์ ์ถ ๊ฒฐ๊ณผ
์๋์ ํ์ด๊ฐ ๋๋ ธ๋ ์ฒซ๋ฒ์งธ ๋ฐฉ์์ด๊ณ , ์์ ํ์ด๊ฐ ๋ ๋น ๋ฅธ ํ์ด์ด๋ค.

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