μμ νμ(Brute Force)μ΄λ?
κ°λ₯ν λͺ¨λ κ²½μ°λ₯Ό μ λΆ νμν΄μ μ λ΅μ μ°Ύλ μκ³ λ¦¬μ¦ κΈ°λ²
- “μ΄κ² μ λ΅μΌ μλ μμ§ μμκΉ?” → λͺ¨λ κ²½μ°λ₯Ό λ€ ν΄λ³΄λ λ°©μ
- μ λ΅μ 보μ₯νμ§λ§, λ릴 μ μμ
- λ°μ΄ν° μμ΄ μμ λ κ°λ ₯ν μ λ΅
νλͺ© | μ€λͺ |
π‘ μ₯μ | ꡬν κ°λ¨, μ λ΅ λ³΄μ₯ |
π’ λ¨μ | μκ° μ€λ 걸릴 μ μμ |
β μΈλ§ν κ²½μ° | κ²½μ°μ μκ° μμ λ (ex. N ≤ 10β΄ μ΄ν) |
β λΉμΆ μν© | κ²½μ°μ μκ° λ무 λ§μ λ (N! λλ 2^N μ΄μ) |
λν λ¬Έμ μ ν
μ ν | μ€λͺ |
λͺ¨λ μ‘°ν© μλ | ex. λ‘λ λ²νΈ, μ«μ μλ¦Ώμ μ‘°ν© |
λͺ¨λ μμ΄ μλ | ex. μΈνμ μν(TSP), λμ΄νΈ μ΄λ |
λΆλΆμ§ν© νμ | ex. λΆλΆν©, λ°°λλ¬Έμ (μμ μ λ ₯μΌ λ) |
λ°±νΈλνΉ | μμ νμμ κ°μ§μΉκΈ°λ₯Ό λν μ§ν λ²μ |
μμ νμμ κΈ°λ³Έ κ°λ μ "μ λΆ ν΄λ³΄κΈ°"μ΄λ, μ¬λ¬ μ’ λ₯μ νμλ°©λ²μ΄ μλ€.
μμ νμμ λνμ μΈ μ’ λ₯
: ν¬κ² 5κ°μ§λ‘ 보μλ©΄ λ¨μ BruteForse, μμ΄, μ¬κ·νΈμΆ, λΉνΈλ§μ€ν¬, BFS/DFS κ° μλ€.
μλμ νλ κ·Έκ±Έ λ μΈμΈνκ² λλ λ³Έκ².
μ ν | ν΅μ¬ ν€μλ | μ¬μ© λꡬ/μμ | μκ°λ³΅μ‘λ |
1. μμ΄(permutation) | μμ μ€μ, μ€λ³΅ β | itertools.permutations() | O(N!) (λ³΄ν΅ N ≤ 8 μ΄ν) |
2. μ‘°ν©(combination) | μμ μκ΄μμ, μ€λ³΅ β | itertools.combinations() | O(NCr) ≈ O(2βΏ) |
3. μ€λ³΅ μμ΄(product) | μμ μ€μ, μ€λ³΅ νμ© | itertools.product() | O(N^R) |
4. λΆλΆμ§ν© νμ(subset) - λΉνΈλ§μ€ν¬ |
μ ννκ±°λ λ§κ±°λ | λΉνΈλ§μ€ν¬, 1 << N | O(2βΏ) |
5. μΌλ° μμ΄/λ²μ μμ νμ (λ¨μ Brute Force) |
λͺ¨λ μλ₯Ό λ€ λλ €λ΄ | range(), μ€μ²© forλ¬Έ | O(N), O(N²), O(N³) … μν©μ λ°λΌ |
6. BFS / DFS μμ νμ | νΈλ¦¬, κ·Έλν, λ§΅ λ± κ΅¬μ‘° νμ | deque(BFS), μ¬κ·/μ€ν(DFS), visited | O(V + E), O(Nα΄°) |
7. μ¬κ· νΈμΆ κΈ°λ° μμ νμ | κΉμ΄ μ°μ μΌλ‘ μ§μ λͺ¨λ κ²½μ° μμ± | dfs(depth) + λ°±νΈλνΉ (append/pop) | λ³΄ν΅ O(N!) λλ O(2βΏ) |
* μκ° λ³΅μ‘λ κ° μ‘λ κΈ°μ€
: Nμ΄ μμΌλ©΄ (N ≤ 10~15): μμ νμ μ¬μ© κ°λ₯ / Nμ΄ ν¬λ©΄ (N ≥ 20~30): λ°±νΈλνΉ or DPκ° νμν¨
μ°μ μμ νμλΆν° μμλ³΄κ³ μλμμ λ°±νΈλνΉμ 보μ.
1. μμ΄ (Permutation)
μ£Όμ΄μ§ nκ°μ μμ μ€μμ rκ°λ₯Ό λ½μ μμ μκ² λμ΄
from itertools import permutations
for p in permutations([1, 2, 3], 2):
print(p) # (1,2), (1,3), (2,1), (2,3), ...
2. μ‘°ν© (Combination)
μμλ μ κ²½ μ μ°κ³ , rκ°λ₯Ό λ½κΈ°λ§ νλ©΄ λ¨
from itertools import combinations
for c in combinations([1, 2, 3], 2):
print(c) # (1,2), (1,3), (2,3)
μμ μκ΄ μμ΄ 2κ°λ§ λ½λλ€. (볡κΆ, ν λλκΈ°, μΌμ΄μ¬ λ¬Έμ λ±)
3. μ€λ³΅ μμ΄ (Product)
μ€λ³΅ νμ©, λͺ¨λ κ²½μ°μ μλ₯Ό λμ΄
from itertools import product
for p in product([0, 1], repeat=3):
print(p) # (0,0,0), (0,0,1), ..., (1,1,1)
μλ¦Ώμ μ‘°ν©, λΉλ°λ²νΈ λ§λ€κΈ°, μμ±μ λ¬Έμ λ±
4. λΆλΆμ§ν© νμ (Subset) - λΉνΈλ§μ€ν¬ νμ
nκ°μ μμμ λν΄ ν¬ν¨ν μ§ λ§μ§(μ νν μ§ λ§μ§)λ₯Ό 2^n κ²½μ°λ‘ λλ
arr = [1, 2, 3]
n = len(arr)
for i in range(1 << n): # 2^n λ² μν
subset = []
for j in range(n):
if i & (1 << j):
subset.append(arr[j])
print(subset)
λΆλΆν© λ¬Έμ , νΉμ 쑰건μ λ§μ‘±νλ μ‘°ν©
" 1 << n " λΉνΈ μ°μ°μλ‘, 1μ μΌμͺ½μΌλ‘ nλΉνΈλ§νΌ μ΄λνλ€λ λ».
1 << 3 μ 8μ΄λ€.
# μ? μ΄μ§μ 1 → (3μΉΈ λΉνΈ μ΄λ)→ μ΄μ§μ 1000 => (2^3 = 8)
κ·Έλμ μ¦, range(1 << n)μ 0λΆν° 2βΏ - 1κΉμ§λΌλ λ»μ΄ λλ€.
nκ°μ μμκ° μμΌλ©΄ λΆλΆμ§ν©μ κ°μλ 2βΏ κ°μ΄λ―λ‘, λͺ¨λ λΆλΆμ§ν©μ μννκΈ° μν΄ μ¬μ©λλ€.
5. μΌλ°μ μΈ μμΉ μμ νμ
μ«μ λ²μλ₯Ό μ§μ νκ³ λͺ¨λ κ²½μ°μ μλ₯Ό λ€ λλ¦Ό
for i in range(1000):
for j in range(1000):
if i * j == 123456:
print(i, j)
κ·Έλ°λ° μκΉ μμμ,
* μκ° λ³΅μ‘λ κ° μ‘λ κΈ°μ€
: Nμ΄ μμΌλ©΄ (N ≤ 10~15): μμ νμ μ¬μ© κ°λ₯ / Nμ΄ ν¬λ©΄ (N ≥ 20~30): λ°±νΈλνΉ or DPκ° νμν¨
μ°μ μμ νμλΆν° μμλ³΄κ³ μλμμ λ°±νΈλνΉμ 보μ.
λΌκ³ λ§νμλ€.
λ°±νΈλνΉ(Backtracking)μ΄λ?
ν΄κ²°μ± μΌλ‘ κ°λ λμ€μ λ§νκ² λλ©΄, κ·Έ μ§μ μΌλ‘ λ€μ λμκ°μ λ€λ₯Έ κ²½λ‘λ₯Ό νμ.
λͺ¨λ κ°λ₯ν κ²½μ°μ μλ₯Ό νμνμ§λ§, λ§νλ©΄ λμκ°λ―λ‘ μκ° μ μ½λ¨.
μμ νμ + κ°μ§μΉκΈ°(pruning) κΈ°λ²
= λΆνμν νμμ μΌμ° μ€λ¨ν΄μ μκ° μ μ½!
Nμ리 μ«μ λ§λ€κΈ°μ μμλ₯Ό λ€μ΄λ³΄λ©΄,
def dfs(depth, path):
if depth == N:
print(path)
return
for i in range(10):
if i in path: # μ€λ³΅ μ κ±° (κ°μ§μΉκΈ°!)
continue
dfs(depth + 1, path + [i])
- depth == Nμ΄λ©΄ λλκ³ ,
- i in pathμΈ κ²½μ°λ λ³Ό νμ μμΌλκΉ λμ΄κ°λ€.
β λ³΄ν΅ DFSλ₯Ό κΈ°λ°μΌλ‘ ꡬννλ€. ν κ²½λ‘λ₯Ό λκΉμ§ νκ³ λ€μ΄κ°λ€κ°, 쑰건μ λ°λΌ λ€μ λμμ¬ μ μμΌλ―λ‘(μ¬κ·)
def backtrack(path):
if 쑰건 λ§μ‘±:
μ λ΅ μ μ₯ or μΆλ ₯
return
for μ ν in ν보ꡰ:
if 쑰건μ μ λ§μΌλ©΄ continue # κ°μ§μΉκΈ°
path.append(μ ν)
backtrack(path)
path.pop() # μμ볡ꡬ
append → μ¬κ· → pop
'π» μ½λ©ν μ€νΈ > μκ³ λ¦¬μ¦, μλ£κ΅¬μ‘°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μκ³ λ¦¬μ¦] μ΅λ¨κ²½λ‘(1) λ€μ΅μ€νΈλΌ (0) | 2025.05.02 |
---|---|
[μκ³ λ¦¬μ¦] μ΅λ¨κ²½λ‘ (0) | 2025.05.02 |
[μλ£κ΅¬μ‘°] ν (Heap) - νμ΄μ¬λΆν° μλ°μ€ν¬λ¦½νΈκΉμ§ (1) | 2025.04.30 |
μλ£κ΅¬μ‘° νλ²μ μ 리 (0) | 2025.04.30 |
DFS μμ μ«μ λ¨Όμ νμ (0) | 2025.03.28 |