2021. 1. 23. 18:23ใ๐ Algorithm/๐ช๐ป Python ๋ฌธ์ ํ์ด
๋ฌธ์ ์ค๋ช
๊ฐ๋ก, ์ธ๋ก ๊ธธ์ด๊ฐ n์ธ ์ ์ฌ๊ฐํ์ผ๋ก๋ ์ฒด์คํ์ด ์์ต๋๋ค. ์ฒด์คํ ์์ n๊ฐ์ ํธ์ด ์๋ก๋ฅผ ๊ณต๊ฒฉํ ์ ์๋๋ก ๋ฐฐ์นํ๊ณ ์ถ์ต๋๋ค.
์๋ฅผ ๋ค์ด์ n์ด 4์ธ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ํธ์ ๋ฐฐ์นํ๋ฉด n๊ฐ์ ํธ์ ์๋ก๋ฅผ ํ๋ฒ์ ๊ณต๊ฒฉ ํ ์ ์์ต๋๋ค.
์ฒด์คํ์ ๊ฐ๋ก ์ธ๋ก์ ์ธ๋ก์ ๊ธธ์ด n์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, n๊ฐ์ ํธ์ด ์กฐ๊ฑด์ ๋ง์กฑ ํ๋๋ก ๋ฐฐ์นํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ฅผ returnํ๋ solutionํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์ฌํญ
- ํธ(Queen)์ ๊ฐ๋ก, ์ธ๋ก, ๋๊ฐ์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
- n์ 12์ดํ์ ์์ฐ์ ์ ๋๋ค.
์ ์ถ๋ ฅ ์์
ํ์ด ๊ณผ์
๋ฐฑํธ๋ํน์ ํตํด ํธ์ ๋์ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ฒ์ฌํด์ผํ๋ฏ๋ก DFS ๋ฌธ์ ๋ผ๊ณ ์ง๊ฐํ ์ ์์๋ค. ํ์ง๋ง ํธ์ ๋์ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ด๋๊ฒ ์ด๋ ค์ ๋ค. ํผ์ ๊ณ ๋ฏผํด๋ณด๋ค๊ฐ ๋์ ํ ๊ตฌํํ์ง ๋ชปํ ๊ฑฐ ๊ฐ์ ๊ตฌ๊ธ๋ง์ ํด๋ณด์๋ค.
๊ณ ๋ฏผํด์ผ ๋ ๋ฌธ์ ๊ฐ ์๋ค.
ํธ์ ๋์ ์ ์๋ ์๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ์ ์ ์๋?!
ํธ์ ์ด๋์ ๋์ ์ ์์์ง ๊ฒ์ฌํ ์ ์๋ ์กฐ๊ฑด์ ํฌ๊ฒ 3๊ฐ์ง๊ฐ์๋ค.
1. Row๊ฐ ๊ฒน์น์ง ์๋ ๊ณณ
2. Column์ด ๊ฒน์น์ง ์๋ ๊ณณ
3. ๋๊ฐ์ ์ด ๊ฒน์น์ง ์๋ ๊ณณ (โ๏ธ,โ๏ธ)๋ฐฉํฅ
์ด๊ฒ์ผ๋ก queen์ ๋์ ์ ์๋ ์๋ฆฌ๋ฅผ ๊ฒ์ฌํ๋ฉด๋๋ค.
๋๋ ํธ์ ๋์ ์ ์๋ ์๋ฆฌ๋ฅผ ๊ฒ์ฌํ๊ธฐ ์ํด row๊ธฐ์ค์ผ๋ก dfs๋ฅผ ๊ฒ์ฌํ๋ฏ๋ก column์ด ๊ฒน์น์ง ์๋์ง, ๋๊ฐ์ (โ๏ธ,โ๏ธ)๋ฐฉํฅ์ด ๊ฒน์น์ง ์๋์ง๋ง ๊ฒ์ฌํด์ฃผ๋ฉด ๋์๋ค. column ๊ฒ์ฌ๋ n ํฌ๊ธฐ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ ๊ตฌํํด์ฃผ๋ฉด ๋์ง๋ง ๋๊ฐ์ ๊ฒ์ฌ๋ ๊ท์น์ ์ฐพ์์ผ ํ๋ค.
์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ดํด๊ฐ ์กฐ๊ธ ์ฌ์ธ ๊ฒ์ด๋ค.
๋ค์์ DFS๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ค ์์ผ๋ก DFS๊ฐ ์๋ฎฌ๋ ์ด์ ๋ ์ง ๊ณ ๋ฏผํ๋ฉฐ DFSํจ์๋ฅผ ์ง์ผํ๋ค.
์๋ฎฌ๋ ์ด์ ๊ณผ์
- 0๋ฒ ์งธ ์ค์ ๋ง์ ๋๋๋ค.
- (0,0)์ ๋ง์ ๋๊ณ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ค.
- 1๋ฒ์งธ ์ค์ ๋ง์ ๋๋๋ค.
- (1,0) (1,1),(1,2)(1,3)๋ฅผ ์ฐจ๋ก๋ก ๊ฒ์ฌํ๋ฉฐ ๋ง์ ๋์ ์ ์๋ ์๋ฆฌ๋ฅผ ์ฐพ๋๋ค.
- 2๋ฒ์งธ ์ค์ ๋ง์ ๋๋๋ค.
- (2,0),(2,1) (2,2) (2,3)์ ์ฐจ๋ก๋ก ๊ฒ์ฌํ๋ฉฐ ๋ง์ ๋์ ์ ์๋ ์๋ฆฌ๋ฅผ ์ฐพ๋๋ค.
- 3๋ฒ์งธ ์ค์ ๋ง์ ๋๋๋ค.
- (3,0) (3,1) (3,2) (3,3)์ ์ฐจ๋ก๋ก ๊ฒ์ฌํ๋ฉฐ ๋ง์ ๋์ ์ ์๋ ์๋ฆฌ๋ฅผ ์ฐพ๋๋ค.
- 1๋ฒ์งธ ์ค์ ๋ง์ ๋๋๋ค.
- (1,0)์ ๋ง์ ๋๊ณ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
- ...(3,0) ๊น์ง ๋ฐ๋ณต
- (0,0)์ ๋ง์ ๋๊ณ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ค.
def solution(n):
global answer
answer = 0
col = [True] * n
diagonal1 = [True] * (2 * n - 1)
diagonal2 = [True] * (2 * n - 1)
def check_queen(x, y):
return col[y] and diagonal1[x + y] and diagonal2[x - y + n - 1]
def dfs(x):
global answer
if x == n:
answer += 1
else:
for idx in range(n):
if check_queen(x, idx):
col[idx] = False
diagonal1[x + idx] = False
diagonal2[x - idx + n - 1] = False
dfs(x + 1)
col[idx] = True
diagonal1[x + idx] = True
diagonal2[x - idx + n - 1] = True
dfs(0)
return answer
'๐ Algorithm > ๐ช๐ป Python ๋ฌธ์ ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python - ๋ฐฑ์ค 1931] ํ์์ค ๋ฐฐ์ (0) | 2021.01.24 |
---|---|
[Python - ํ๋ก๊ทธ๋๋จธ์ค Level2] H-Index (5) | 2021.01.21 |
[Python - ํ๋ก๊ทธ๋๋จธ์ค Level2] ์นดํซ (0) | 2021.01.21 |