๋ฐฑํธ๋ํน(Backtracking) ์ด๋?
๋ฐฑํธ๋ํน์ ํ์ ์กฐ๊ฑด์ ๋ํด ํด๋ฅผ ์ฐพ๋ ํ์ ๋ฐ ์ต์ ํ ๋ฌธ์ ์ ํด๊ฒฐ ์ ๋ต์ด๋ค. ๋ฐฑํธ๋ํน์ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด ํ์์ ์ํํ๋ ๊ณผ์ ์์ ๋ถํ์ํ ๊ฒฝ๋ก๋ ๋ฐฐ์ ํ์ฌ ํจ์จ์ฑ์ ๋์ด๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ํ์ ์กฐ๊ฑด์ ๋ํด์ ๊ฒฝ์ฐ์ ์๋ฅผ ์๋ํ๊ธฐ ๋๋ฌธ์ ๋จ์ ๋ค์ค for๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์จ์ ์ผ๋ก ๋์ํ๋ค.
Backtracking์ ๋ฌธ์ ํด๊ฒฐ ์ ๋ต
- ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํ ๋ชจ๋ ๊ฐ๋ฅํ ํด์ ์กฐํฉ์ ์ ์ํจ
- ๊ฐ ๋จ๊ณ์์ ํ์ฌ ์ํ๊ฐ ๋ฌธ์ ์ ํ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ง ๊ฒ์ฌํ๊ณ , ํด๊ฐ ๋ ์ ์๋ ๊ฒฝ๋ก๋ผ๋ฉด ๊ฐ์ง์น๊ธฐ๋ฅผ ํตํด ์ ๋ต ๊ฒฝ๋ก์์ ๋ฐฐ์ ํจ
- ์ ๋ต์ด ๋ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ฌ๊ท์ ์ผ๋ก ์งํ์ ํ๋ค. ํน์ ๊ฒฝ๋ก๊ฐ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ๋ฉด ์ด์ ๋จ๊ณ๋ก ๋์๊ฐ ๊ฒฝ๋ก๋ฅผ ํ์ํจ
- ํ์ํ๋ค๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ์ข ๋ฃํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ํ์ํ๊ธฐ ์ํด ์ด์ ๊ฒฝ๋ก๋ก ๋๋์๊ฐ
DFS์ Backtracking
DFS์ Backtracking ๋ชจ๋ ํ์์ ์ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋น์ทํด ๋ณด์ด์ง๋ง ๋ค๋ฅธ์ ์ด ์๋ค.
- DFS
- ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์ํจ
- DFS๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํด๊ฐ๋ฉฐ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
- ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์ํจ
- Backtracking
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ๋ก๋ง ํ์
- Backtracking์ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ค ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋๋ค๋ฉด ํ์์ ์ค๋จํ๊ณ ์ด์ ๋จ๊ณ๋ก ๋์๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ค.
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ๋ก๋ง ํ์
Backtracking ๊ตฌํ ๋ฐฉ์
def backtracking(n):
if ์ ๋ต:
์ ๋ต_์ถ๋ ฅ_or_์ ์ฅ()
return
for node in child_nodes:
if ์กฐ๊ฑด_๋ง์กฑ(node):
์์๋
ธ๋๋ก_์ด๋
backtracking(n+1)
๋ถ๋ชจ๋
ธ๋๋ก_์ด๋
Backtracking ์์
Backtracking์ ๊ฐ์ฅ ์ ๋ช ํ ๋ฌธ์ ๋ N-Queen ๋ฌธ์ ์ด๋ค.
๋ฌธ์ ์ค๋ช
N-Queen ๋ฌธ์ ๋ ํฌ๊ธฐ๊ฐ N × N์ธ ์ฒด์คํ ์์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๋ฌธ์ ์ด๋ค.
N์ด ์ฃผ์ด์ก์ ๋, ํธ์ ๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ์ค์ N์ด ์ฃผ์ด์ง ( 1 <= N < 15)
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅ
์์
N = 8
answer = 92
import sys
# ์ฒด์คํ์ ํฌ๊ธฐ๋ฅผ ์
๋ ฅ๋ฐ์
n = int(input())
# ํ์ฌ ๋ฐฐ์นํ ํธ์ด ์ด์ ์ ๋ฐฐ์นํ ํธ๋ค๊ณผ ์ถฉ๋ํ๋์ง ํ์ธ
def attack(x):
for i in range(x):
# ๊ฐ์ ์ด์ ์๊ฑฐ๋, ๋๊ฐ์ ์์ ์์ผ๋ฉด ์ถฉ๋์
if row[x] == row[i] or abs(row[x] - row[i]) == abs(x - i):
return True
return False
# start๋ ํ์ฌ ๋๊ณ ์๋ ํ
def dfs(start):
global cnt
๋ชจ๋ ํ์ ํธ์ ๋ฐฐ์นํ๋ค๋ฉด ์ ํจํ ๋ฐฐ์น์ด๋ฏ๋ก cnt ์ฆ๊ฐ
if start == n:
cnt += 1
else:
for i in range(n):
row[start] = i
# ์ถฉ๋์ด ์๋ค๋ฉด ๋ค์ ํ์ ์งํ
if not attack(start):
dfs(start + 1)
# ๊ฐ ํ์ ํธ์ ์ ์ฅํ ๋ฆฌ์คํธ ์ด๊ธฐํ
row = [0] * n
# ๊ฐ๋ฅํ ๊ฐ์ง์๋ฅผ ์ธ๋ ๋ณ์ ์ด๊ธฐํ
cnt = 0
dfs(0)
print(cnt)
'๐ค์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ (Kruskal Algorithm) (0) | 2024.08.29 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] BFS (๋๋น ์ฐ์ ํ์) (0) | 2024.08.20 |
[์๊ณ ๋ฆฌ์ฆ] DFS (๊น์ด ์ฐ์ ํ์) (0) | 2024.08.20 |
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ (Dijkstra Algorithm) (0) | 2024.08.18 |
[์๊ณ ๋ฆฌ์ฆ] ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ (Floyd - Warshall Algorithm) (0) | 2024.08.17 |