Brute-Force

Brute-force

  • brute-forceλŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ κ°„λ‹¨ν•˜κ³  μ‰¬μš΄ 접근법

    • Just-do-it

    • force의 μ˜λ―ΈλŠ” μ‚¬λžŒ(지λŠ₯)λ³΄λ‹€λŠ” μ»΄ν“¨ν„°μ˜ forceλ₯Ό 의미

  • brute-force 방법은 λŒ€λΆ€λΆ„μ˜ λ¬Έμ œμ— 적용 κ°€λŠ₯

  • μƒλŒ€μ μœΌλ‘œ λΉ λ₯Έ μ‹œκ°„μ— 문제 ν•΄κ²°(μ•Œκ³ λ¦¬μ¦˜ 섀계)을 ν•  수 있음

  • λ¬Έμ œμ— ν¬ν•¨λœ 자료(μš”μ†Œ, instance)의 크기가 μž‘λ‹€λ©΄ 유용

  • ν•™μˆ μ  λ˜λŠ” ꡐ윑적 λͺ©μ μ„ μœ„ν•΄ μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ νŒλ‹¨ν•˜κΈ° μœ„ν•œ μ²™λ„λ‘œ μ‚¬μš©λ¨

: μžλ£Œλ“€μ˜ listμ—μ„œ key값을 μ°ΎκΈ° μœ„ν•΄ 첫 번째 μžλ£ŒλΆ€ν„° λΉ„κ΅ν•˜λ©΄μ„œ 진행

  • κ²°κ³Ό

    • 탐색 성곡

    • 탐색 μ‹€νŒ¨

  • λͺ¨λ“  경우의 수λ₯Ό μƒμ„±ν•˜κ³  ν…ŒμŠ€νŠΈν•˜κΈ° λ•Œλ¬Έμ— μˆ˜ν–‰ μ†λ„λŠ” λŠλ¦¬μ§€λ§Œ, 해닡을 찾아내지 λͺ»ν•  ν™•λ₯ μ΄ μž‘μŒ

    • μ™„μ „ 검색은 μž…λ ₯의 크기λ₯Ό μž‘κ²Œ ν•΄μ„œ κ°„νŽΈν•˜κ³  λΉ λ₯΄κ²Œ 닡을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•¨

  • 이λ₯Ό 기반으둜 그리디 기법 μ΄λ‚˜ 동적 κ³„νšλ²•μ„ μ΄μš©ν•΄μ„œ 효율적인 μ•Œκ³ λ¦¬μ¦˜μ„ 찾을 수 있음

  • μ½”λ”©ν…ŒμŠ€νŠΈ λ“±μ—μ„œ 문제λ₯Ό ν’€ λ•Œ, μš°μ„  완점 κ²€μƒ‰μœΌλ‘œ μ ‘κ·Όν•˜μ—¬ 해닡을 λ„μΆœν•œ ν›„, μ„±λŠ₯ κ°œμ„ μ„ μœ„ν•΄ λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜κ³  해닡을 ν™•μΈν•˜λŠ” 것이 λ°”λžŒμ§ν•¨

Baby-gin Game

μ„€λͺ…

  • 0~9 μ‚¬μ΄μ˜ 숫자 μΉ΄λ“œμ—μ„œ μž„μ˜μ˜ μΉ΄λ“œ 6μž₯을 λ½‘μ•˜μ„ λ•Œ, 3μž₯의 μΉ΄λ“œκ°€ 연속적인 번호λ₯Ό κ°–λŠ” 경우λ₯Ό run이라 ν•˜κ³ , 3μž₯의 μΉ΄λ“œκ°€ λ™μΌν•œ 번호λ₯Ό κ°–λŠ” 경우λ₯Ό triplet이라고 ν•œλ‹€.

  • 그리고, 6μž₯의 μΉ΄λ“œκ°€ runκ³Ό triplet으둜만 κ΅¬μ„±λœ 경우λ₯Ό baby-gin 으둜 λΆ€λ₯Έλ‹€

  • 6자리의 숫자λ₯Ό μž…λ ₯ λ°›μ•„ baby-gin μ—¬λΆ€λ₯Ό νŒλ‹¨ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μ™„μ „ 검색을 ν†΅ν•œ Baby-gin μ ‘κ·Ό

  1. κ³ λ €ν•  수 μžˆλŠ” λͺ¨λ“  경우의 수 μƒμ„±ν•˜κΈ°

    • 6개의 숫자둜 λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  숫자 λ‚˜μ—΄ (쀑볡 포함)

  2. ν•΄λ‹΅ ν…ŒμŠ€νŠΈ ν•˜κΈ°

    • μ•žμ˜ 3μžλ¦¬μ™€ λ’€μ˜ 3자리λ₯Ό 잘라, runκ³Ό triplet μ—¬λΆ€λ₯Ό ν…ŒμŠ€νŠΈν•˜κ³  μ΅œμ’…μ μœΌλ‘œ baby-gin νŒλ‹¨

μ™„μ „ 검색

  • λ§Žμ€ μ’…λ₯˜μ˜ λ¬Έμ œλ“€μ΄ νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” κ²½μš°λ‚˜ μš”μ†Œλ₯Ό μ°ΎλŠ” 것

  • μ „ν˜•μ μœΌλ‘œ μˆœμ—΄(permutation), μ‘°ν•©(combination), 그리고 λΆ€λΆ„ 집합(subsets)κ³Ό 같은 쑰합적 λ¬Έμ œλ“€ (Combinatorial Problems) κ³Ό 연관됨

  • μ™„μ „ 검색은 쑰합적 λ¬Έμ œμ— λŒ€ν•œ brute-force 방법이닀

μˆœμ—΄ (Permutation)

  • μ„œλ‘œ λ‹€λ₯Έ 것듀 쀑 λͺ‡ 개λ₯Ό λ½‘μ•„μ„œ ν•œ μ€„λ‘œ λ‚˜μ—΄ν•˜λŠ” 것

  • μ„œλ‘œ λ‹€λ₯Έ n개 쀑 r개λ₯Ό νƒν•˜λŠ” μˆœμ—΄μ€ nPr

  • λ‹€μŒκ³Ό 같은 식이 성립함

    • nPr = n x (n-1) x (n-2) x ... x (n-r+1)

  • nPn = n! 이라고 ν‘œκΈ°ν•˜λ©°, Factorial 이라 뢀름

    • n! = n x (n-1) x (n-2) x ... 2x1

  • μˆœμ—΄μ€ μˆœμ„œν™”λœ μš”μ†Œλ“€μ˜ μ§‘ν•©μ—μ„œ μ΅œμ„ μ˜ 방법을 μ°ΎλŠ” 것과 κ΄€λ ¨ 있음

    • ex) TSP (Traveling Salesman Problem)

  • N 개의 μš”μ†Œλ“€μ— λŒ€ν•΄μ„œ n!개의 μˆœμ—΄λ“€μ΄ 쑴재

    • n >12 인 경우, μ‹œκ°„ λ³΅μž‘λ„ 폭발!!! (μ§€μˆ˜μŠΉμœΌλ‘œ μ˜¬λΌκ°€κΈ° λ•Œλ¬Έμ—...)

1. μž¬κ·€ ν˜ΈμΆœμ„ ν†΅ν•œ μˆœμ—΄ 생성 - κ΅ν™˜μ„ 톡해 생성

def perm(n,k):
    if k == n:
        #do something
 else:
        for i in range(k, n):
            swap(k,i)#swap!
            perm(n, k+1)
            swap(k,i) #λ‹€μ‹œ 원상 볡귀

Subsets (λΆ€λΆ„ 집합)

  • 집합에 ν¬ν•¨λœ μ›μ†Œλ“€μ„ μ„ νƒν•˜λŠ” 것

  • λ‹€μˆ˜μ˜ μ€‘μš” μ•Œκ³ λ¦¬μ¦˜λ“€μ΄ μ›μ†Œλ“€μ˜ κ·Έλ£Ήμ—μ„œ 졜적의 λΆ€λΆ„ 집합을 μ°ΎλŠ” κ²ƒμž„

    • ex) λ°°λ‚­ 짐싸기 (knapsack)

  • N개의 μ›μ†Œλ₯Ό ν¬ν•¨ν•œ 집합

    • 자기 μžμ‹ κ³Ό 곡집합 ν¬ν•¨ν•œ λͺ¨λ“  λ©± 집합(power set)의 κ°œμˆ˜λŠ” 2^n개

    • μ›μ†Œμ˜ μˆ˜κ°€ μ¦κ°€ν•˜λ©΄ λΆ€λΆ„μ§‘ν•©μ˜ κ°œμˆ˜λŠ” μ§€μˆ˜μ μœΌλ‘œ 증가

1. λ‹¨μˆœν•˜κ²Œ λͺ¨λ“  λΆ€λΆ„ 집합 μƒμ„±ν•˜λŠ” 방법

  • 4개 μ›μ†Œλ₯Ό ν¬ν•¨ν•œ 집합에 λŒ€ν•œ power set κ΅¬ν•˜κΈ°

2. Binary Counting

  • μ›μ†Œ μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” N개의 λΉ„νŠΈμ—΄μ„ 이용

  • n번째 λΉ„νŠΈκ°’μ΄ 1이면 n번째 μ›μ†Œκ°€ ν¬ν•¨λ˜μ—ˆμŒμ„ 의미

Combination (μ‘°ν•©)

μ„œλ‘œ λ‹€λ₯Έ n개의 μ›μ†Œ 쀑 r개λ₯Ό μˆœμ„œ 없이 골라낸 것

  • μ‘°ν•©μ˜ μˆ˜μ‹

    • nCr = n-1 C r-1 +n-1 C r

    • nC0 = 1

Last updated