08 01 - nolsigan/nolsigan.github.io GitHub Wiki

Algorithm

| Algorithm 의 λ‚΄μš©μ€ λŒ€λΆ€λΆ„ 'μ•Œκ³ λ¦¬μ¦˜ ν•΄κ²° μ „λž΅'을 μš”μ•½ν•œ κ²ƒμž…λ‹ˆλ‹€.

동적 κ³„νšλ²•

동적 κ³„νšλ²•μ€ 큰 μ˜λ―Έμ—μ„œ λΆ„ν•  정볡과 같은 μ ‘κ·Ό 방식을 μ˜λ―Έν•œλ‹€.
이 문제의 닡을 μ—¬λŸ¬ 번 κ³„μ‚°ν•˜λŠ” λŒ€μ‹  ν•œ 번만 κ³„μ‚°ν•˜κ³  계산 κ²°κ³Όλ₯Ό μž¬ν™œμš©ν•¨μœΌλ‘œμ¨ μ†λ„μ˜ ν–₯상을 κΎ€ν•  수 μžˆλ‹€.

  • 값을 μ €μž₯ν•΄ λ‘λŠ” λ©”λͺ¨λ¦¬μ˜ μž₯μ†Œλ₯Ό μΊμ‹œ(cache)
  • μ€‘λ³΅λ˜λŠ” λΆ€λΆ„ 문제(overlapping subproblems)

이와 같이 ν•¨μˆ˜μ˜ κ²°κ³Όλ₯Ό μ €μž₯ν•˜λŠ” μž₯μ†Œλ₯Ό λ§ˆλ ¨ν•΄ 두고, ν•œ 번 κ³„μ‚°ν•œ 값을 μ €μž₯ν•΄ λ’€λ‹€ μž¬ν™œμš©ν•˜λŠ” μ΅œμ ν™” 기법을 λ©”λͺ¨μ΄μ œμ΄μ…˜(memoization)이라 λΆ€λ₯Έλ‹€.

참쑰적 투λͺ…μ„± (referential transparency)

ν•¨μˆ˜μ˜ λ°˜ν™˜ 값이 κ·Έ μž…λ ₯ κ°’λ§ŒμœΌλ‘œ κ²°μ •λ˜λŠ”μ§€μ˜ μ—¬λΆ€λ₯Ό 참쑰적 투λͺ…성이라 ν•œλ‹€.

κ΅¬ν˜„ νŒ¨ν„΄

  • 항상 κΈ°μ € 사둀λ₯Ό 제일 λ¨Όμ € 처리
  • ν•¨μˆ˜μ˜ λ°˜ν™˜ 값이 항상 0 이상이면 μ΄ˆκΈ°κ°’μ„ -1둜 μ„€μ •
  • reference (&)의 μ‚¬μš©μœΌλ‘œ κ°’μ˜ λ³€ν™˜κ³Ό μ €μž₯을 ν•œλ²ˆμ— 함

μ‹œκ°„ λ³΅μž‘λ„

(μ‘΄μž¬ν•˜λŠ” λΆ€λΆ„ 문제의 수) X (ν•œ λΆ€λΆ„ 문제λ₯Ό ν’€ λ•Œ ν•„μš”ν•œ 반볡문의 μˆ˜ν–‰ 횟수)

μ™„μ „ νƒμƒ‰κ³Όμ˜ 관계

μ™„μ „ νƒμƒ‰μœΌλ‘œ 닡을 ꡬ할 λ•Œ ν”νžˆ κ°€μž₯ λ¬Έμ œκ°€ λ˜λŠ” 것은, μ›ν•˜λŠ” 닡은 μ—†λŠ”λ° 전체 λ‹΅μ˜ κ°œμˆ˜λŠ” λ¬΄μ§€λ§‰μ§€ν•˜κ²Œ λ§Žμ€ κ²½μš°λ‹€.
동적 κ³„νšλ²•μ„ μ‚¬μš©ν•˜λ©΄ μ™„μ „ 탐색이 λ§Œλ“œλŠ” 경둜의 μˆ˜κ°€ 맀우 컀도 λΆˆλ¦¬λŠ” ν•¨μˆ˜μ˜ 경우의 μˆ˜κ°€ μ œν•œμ μ΄λ―€λ‘œ λΉ„λ‘˜κΈ°μ§‘μ˜ 원리에 μ˜ν•΄ μ€‘λ³΅μœΌλ‘œ ν•΄κ²°λ˜λŠ” λ¬Έμ œκ°€ 항상 μ‘΄μž¬ν•œλ‹€.

졜적 λΆ€λΆ„ ꡬ쑰

탐색 κ³Όμ •μ—μ„œ μ§€κΈˆκΉŒμ§€μ˜ κ²½λ‘œμ™€ λ¬΄κ΄€ν•˜κ²Œ ν˜„μž¬ λΆ€λΆ„ 문제λ₯Ό ν•΄κ²°ν•  수 있으면 이λ₯Ό 졜적 λΆ€λΆ„ ꡬ쑰λ₯Ό κ°–λŠ”λ‹€κ³  ν•œλ‹€.
λŒ€λΆ€λΆ„ 직관적이라 λ”°λ‘œ 증λͺ…이 ν•„μš”ν•˜μ§€ μ•Šμ§€λ§Œ κ·Έλ ‡μ§€ μ•Šμ€ 경우 κ·€λ₯˜λ²•, λŒ€μš°λ‘œ 증λͺ…ν•˜κ²Œ λœλ‹€.

=> 졜적 λΆ€λΆ„ ꡬ쑰λ₯Ό λ§Œμ‘±ν•˜λŠ” λΆ€λΆ„ 문제둜 잘 λ‚˜λˆ„λŠ” λŠ₯λ ₯이 동적 κ³„νšλ²•μ„ μž˜ν•˜λŠ” 방법이닀!