![]() |
๋ถ๋ฅ : DFS, ๋ฐฑํธ๋ํน
๋ฌธ์ ๋ ๊ต์ฅํ ๋ด๋ฐฑํ๋ฐ, ๋ฐฑํธ๋ํน์ ์ ์ดํดํ์ง ๋ชปํ๋ฉด ํ๊ธฐ ํ๋ค๋ค.
keypoint : DFS, ๋ฐฑํธ๋ํน
code
import sys
input = sys.stdin.readline
n = int(input())
visited = [-1] * n
cnt = 0
def check(now_row):
for row in range(now_row):
if visited[now_row] == visited[row] or now_row - row == abs(visited[now_row] - visited[row]):
return False
return True
def dfs(row):
global cnt
if row == n:
cnt += 1
else:
for col in range(n):
visited[row] = col
if check(row):
dfs(row + 1)
dfs(0)
print(cnt)
์ค์ํ ๋ด์ฉ
์ฒด์คํ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํํ๊ธฐ ์ํด 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ง ์์๋ ๋๋ค๋ ๊ฒ์ด ์ธ์์ ์ธ ํ์ด ๋ฐฉ์์ด์๋ค.
1์ฐจ์ ๋ฐฐ์ด์ initialize ํด๋๊ณ ๋ฐฐ์ด ๊ฐ ์์์ ๊ฐ์ด ์ด์ด ๋๊ณ ์ธ๋ฑ์ค๊ฐ ํ์ ๊ฐ์ด ๋๋ ํ์ด ๋ฐฉ์์ผ๋ก 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ง ์์๋ ๋๋ ๋ฌธ์ ํ์ด ๋ฐฉ์์ธ๋ฐ ์ ์ฝ๋๋ฅผ ํ๋ํ๋ ์ฐข์ด์ ํด์ํด๋ณด๊ฒ ๋ค.
๊ฐ์ ์ด์ ํธ์ด ์๋์ง ํ์ธํ๋ ์ฝ๋์ด๋ค.
def check(now_row):
for row in range(now_row):
if visited[now_row] == visited[row] or now_row - row == abs(visited[now_row] - visited[row]):
return False
return True
visited[now_row] == visited[row] ๋ 0๋ถํฐ now_row-1 ๊น์ง์ ํ์ ๊ฒ์ฌํ๋ฉด์ ๊ฐ์ ์ด { ๋ฐฐ์ด์ ๊ฐ์ด '์ด' ๊ฐ์ด๋ค. }์ ํธ์ด ์๋์ง ๊ฒ์ฌํ๋ ์ฝ๋์ด๋ค.
now_row - row == abs(visited[now_row] - visited[row]) ๋ ๋๊ฐ์ ์ ์์นํ ํธ์ด ์๋์ง ๊ฒ์ฌํ๋ ์ฝ๋์ด๋ค.
now_row - row ๋ ํ์ฌ ์์น์์ row ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค. ๋๊ฐ์ ์ ์์นํ๋ค๋ฉด '์ด' ๊ณผ ๊ฐ์ ๊ฐ๋งํผ ๋จ์ด์ ธ ์์ํ ๋ now_row - ro == abs(visited[now_row] - visited[row]) ๊ฐ True ๋ผ๋ฉด ๋๊ฐ์ ์ ํธ์ด ์กด์ฌํ๋ ๊ฒ์ด๋ฏ๋ก False ๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
def dfs(row):
global cnt
if row == n:
cnt += 1
else:
for col in range(n):
visited[row] = col
if check(row):
dfs(row + 1)
์ฒด์คํ์์ row ๊ฐ n ๊น์ง ์ ์์ง์ฌ ํธ์ ๋์๋ค๋ฉด cnt๋ฅผ 1์ถ๊ฐ ํ๋ค.
n ๊น์ง ์ปค์ง๊ธฐ ์ , ์ฌ๊ท์ ์ผ๋ก ํธ์ ๋์๋ ํ๋์ ์นธ๋ง๋ค ๋ค์ ๋จ๊ณ์ ๊ฐ๋ฅ์ฑ์ ์ฒดํฌํ๊ฒ ๋๋ค.