๐ง ๋ฐฑํธ๋ํน ( Backtracking )
๐ค ๋ฐฑํธ๋ํน์ด๋?
DFS์ ์ผ์ข ์ธ ๋ฐฑํธ๋ํน์ ์ผ๋ฐ์ ์ธ DFS์ ๋ฌ๋ฆฌ ๊ฐ์ง์น๊ธฐ(pruning)๋ฅผ ์งํ
๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๋ ๋์ ์กฐ๊ฑด์ ๊ฑฐ๋๋ฐ, ๋ค์๊ณผ ๊ฐ๋ค.
- ์ ๋ง(promising)ํ์ง ์์ ๊ฒฝ์ฐ์๋ ํ์์ ์ค์งํ๊ณ ์ด์ ๋ ธ๋๋ก ๋์๊ฐ์ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ค.
๋ฐฑํธ๋ํน์ DFS, BFS ๋๊ฐ์ง๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก DFS๋ก ๊ตฌํํ๋๊ฒ์ด ๋ ํธํ๋ค.
(BFS๋ ํ์ ํฌ๊ธฐ๊ฐ ์ปค์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋ณดํต ์ผ๋ฐ์ ์ผ๋ก DFS๋ฅผ ์ฌ์ฉํ๋ค)
๋ค๋ง ํธ๋ฆฌ์ ๊น์ด๊ฐ ๋ฌดํ๋๊ฐ ๋ ๋, BFS๋ฅผ ์ฌ์ฉํ๋ค.
๋ํ ์ผ๋ฐ์ ์ผ๋ก DFS๋ ์คํ์ด๋ ์ฌ๊ท๋ก, BFS๋ ํ๋ก ๊ตฌํํ๋ค.
๋ฐฑํธ๋ํน์ ๋ต์ด ๋ ์ ์๋ ํ๋ณด๋ ๋์ด์ ๊น๊ฒ ๋ค์ด๊ฐ์ง ์๊ณ ๋๋์๊ฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
๐ค ๋ฐฑํธ๋ํน ์๋์ฝ๋
procedure backtracking(c) is
if reject(P, c) then return
if accept(P, c) then output(P, c)
s ← first(P, c)
while s ≠ NULL do
backtracking(s)
s ← next(P, s)
reject(P,c): ๋ง์ฝ ๋ค์์ ๋
ธ๋๊ฐ ํ๋ณด๊ฐ ์๋๋ค๋ฉด return์ผ๋ก ์ข
๋ฃ.
accept(P,c): ๋ง์ฝ ํ์ฌ ๋
ธ๋๊น์ง๊ฐ ๋ต๊ณผ ์ผ์นํ๋ค๋ฉด ๋ต์ ์ถ๋ ฅ.
first(P,c): ํ๋ณด C์ ์ฒซ๋ฒ์งธ ํ์ฅ์ ์์ํ๋ค.
๋ต์ด ์์๋๊น์ง ๋ค์ ํจ์๋ฅผ ๊ณ์ ๋ฐ๋ณต.
๐ง ๋ฐฑ์ค 15649
DFS์ ๋ฐฉ๋ฒ ์ค ํ๋์ธ ๋ฐฑํธ๋ํน์ ์ด์ฉํ๋ค.
๐คซ ํด๊ฒฐ์ ์ค๋ง๋ฆฌ . ๋ฐฑํธ๋ํน
์ด๋, ์๊ณ ๋ฆฌ์ฆ์ ํต์ฌ์ ์คํ์ ์ด์ฉํ ๊ตฌํ์์ ํจ์์ ํธ์ถ๋ฐฉ์์ด ์คํ์ ๋์๋ฐฉ์์์ ์ด์ฉํ๋ค.
ํจ์์ ํธ์ถ = push, ํจ์์ ์ข ๋ฃ = pop๊ณผ ๊ฐ์ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๐ค Algorithm ๊ณผ์
1. ํด๋นํ๋ ๊ฒฝ์ฐ๋ฅผ ์คํ์ pushํ๊ณ ๋์์ด ๋๋๋ฉด ๋ค์ ๋นผ๋ด๋ pop์ ์งํ
2. ์ด๋ ๊ฒ ์งํํ ๋, ์ด๋ฏธ ์ ํํ ์ซ์๋ ๋ฐฐ์ (1 1์ ์๋๋ฏ๋ก)ํด์ผ ํ๋ฏ๋ก ๊ฐ์ง์น๊ธฐ(pruning)
๐คซ solution_15649 (Backtracking)
n, m = map(int, input().split()) stack = [] def f(): if len(stack) == m: print(" ".join(map(str, stack))) return for i in range(1, n+1): if i in stack: continue stack.append(i) f() stack.pop() f()
๐คซ solution_15649 (itertools์ permutations ์ฌ์ฉ)
from itertools import permutations n, m = map(int, input().split()) num = [i for i in range(1, n+1)] ans = permutations(num, m) for i in ans: for j in i: print(j, end=' ') print()
๐ง ๋ฐฑ์ค 15650~15652
๐คซ solution_15650n, m = map(int, input().split()) stack = [] first = 1 def f(first): if len(stack) == m: print(" ".join(map(str, stack))) return for i in range(first, n+1): if i in stack: pass stack.append(i) f(i+1) stack.pop() f(first)
๐คซ solution_15651
n, m = map(int, input().split()) stack = [] def f(): if len(stack) == m: print(" ".join(map(str, stack))) return for i in range(1, n+1): stack.append(i) f() stack.pop() f()
๐คซ solution_15652
n, m = map(int, input().split()) stack = [] first = 1 def f(first): if len(stack) == m: print(" ".join(map(str, stack))) return for i in range(first, n+1): stack.append(i) f(i) stack.pop() f(first)โ