dev_sia 2022. 12. 8. 00:26
  • 11μž₯μ—μ„œλŠ” μž¬κ·€μ μœΌλ‘œ μž‘μ„±ν•˜λŠ” 법과 μž¬κ·€λ‘œ 보닀 λ³΅μž‘ν•œ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 법을 λ°°μ› λ‹€.
  • κ·ΈλŸ¬λ‚˜ μž¬κ·€λ‘œ μ–΄λ–€ 문제λ₯Ό ν•΄κ²°ν•  μˆ˜λŠ” μžˆμ–΄λ„ μ œλŒ€λ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ 또 λ‹€λ₯Έ λ¬Έμ œκ°€ λ°œμƒν•˜κΈ°λ„ ν•œλ‹€.
  • μž¬κ·€λ₯Ό 잘λͺ» μ‚¬μš©ν•  경우 μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„κ°€ O(2^N)κ³Ό 같은 κ°€μž₯ 느린 λΉ… 였 μΉ΄ν…Œκ³ λ¦¬μ— μ†ν•˜κ²Œ 될 수 μžˆλ‹€.
  • 12μž₯μ—μ„œλŠ” μž¬κ·€μ˜ 속도λ₯Ό 느리게 λ§Œλ“œλŠ” κ°€μž₯ ν”ν•œ κ±Έλ¦ΌλŒμ„ μ°Ύκ³  κ·ΈλŸ¬ν•œ μ•Œκ³ λ¦¬μ¦˜μ„ λΉ… 였 κ΄€μ μ—μ„œ μ–΄λ–»κ²Œ λ‚˜νƒ€λ‚΄λŠ”μ§€, μ–΄λ–»κ²Œ κ°œμ„ ν•˜λŠ”μ§€λ₯Ό λ°°μš΄λ‹€.

1. λΆˆν•„μš”ν•œ μž¬κ·€ 호좜

  • λ™μΌν•œ ν•˜μœ„ 문제의 계산 κ²°κ³Όλ₯Ό μ—¬λŸ¬ 번 ν˜ΈμΆœν•˜λŠ”λ°, λ™μΌν•œ 인자λ₯Ό λ„£μ—ˆμ„ λ•Œ 항상 λ™μΌν•œ κ²°κ³Όκ°€ λ‚˜μ˜¬ λ•Œ

2. λΉ… 였λ₯Ό μœ„ν•œ μž‘μ€ κ°œμ„ 

  • μ΄λŸ¬ν•œ 좔가적인 μž¬κ·€ ν˜ΈμΆœμ„ μ „λΆ€ 없앨 수 μžˆλŠ” 방법이 μžˆλ‹€.
  • μ½”λ“œμ—μ„œ κ²°κ³Όλ₯Ό λ³€μˆ˜μ— μ €μž₯ν•˜λ©΄ λœλ‹€.
  • 비결은 ν•„μš”ν•œ ν•¨μˆ˜ ν˜ΈμΆœμ„ ν•œ 번만 μˆ˜ν–‰ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό λ³€μˆ˜μ— μ €μž₯ν•¨μœΌλ‘œμ¨ ν•¨μˆ˜λ₯Ό λ‹€μ‹œ ν˜ΈμΆœν•˜μ§€ μ•Šμ•„λ„ 되게 ν•˜λŠ” 것이닀.

3. μž¬κ·€μ˜ νš¨μœ¨μ„±

  • λΉ… μ˜€λŠ” 데이터 μ›μ†Œκ°€ N개일 λ•Œ μ–Όλ§ˆλ‚˜ λ§Žμ€ 단계 μˆ˜κ°€ ν•„μš”ν•œκ°€λΌλŠ” 핡심 μ§ˆλ¬Έμ— λŒ€ν•œ λ‹΅μ΄μ—ˆλ‹€.
  • λΆˆν•„μš”ν•œ μž¬κ·€ ν˜ΈμΆœμ„ ν”Όν•˜λŠ” 것이 μž¬κ·€λ₯Ό λΉ λ₯΄κ²Œ λ§Œλ“œλŠ” 핡심 비결이닀.
  • 계산 κ²°κ³Όλ₯Ό λ³€μˆ˜μ— μ €μž₯ν•˜λŠ” 뢀뢄이 μ–Έλœ» λ΄μ„œλŠ” μ½”λ“œμ—μ„œ μ•„μ£Ό μ‚¬μ†Œν•œ 변화더라도 ꢁ극적으둜 ν•¨μˆ˜ 속도λ₯Ό O(2^N)μ—μ„œ O(N)으둜 λ³€ν™”μ‹œν‚¨λ‹€.

4. ν•˜μœ„ 문제 쀑첩

  • ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄
  • ν•˜μœ„ 문제: λ™μΌν•œ 문제λ₯Ό μž‘κ²Œ λ§Œλ“€μ–΄ ν•΄κ²°ν•  λ•Œ, “μž‘μ€ 문제”λ₯Ό ν•˜μœ„ 문제라고 λΆ€λ₯Έλ‹€.
  • ν•˜μœ„ λ¬Έμ œκ°€ μ€‘μ²©λ˜λŠ” μ΄μœ λŠ” fib(n - 2)와 fib(n - 1)이 결과적으둜 λ™μΌν•œ ν•¨μˆ˜λ₯Ό μ—¬λŸ¬λ²ˆ μ€‘λ³΅ν•΄μ„œ ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
  • κ²°κ΅­ μ•Œκ³ λ¦¬μ¦˜μ€ O(2^N)의 μ†λ„λ‘œ 맀우 느리게 ν˜ΈμΆœλœλ‹€.

5. λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ ν†΅ν•œ 동적 ν”„λ‘œκ·Έλž˜λ°

  • 동적 ν”„λ‘œκ·Έλž˜λ°(dynamic programming)은 ν•˜μœ„ λ¬Έμ œκ°€ μ€‘μ²©λ˜λŠ” μž¬κ·€ 문제λ₯Ό μ΅œμ ν™”ν•˜λŠ” μ ˆμ°¨λ‹€.
  • 일반적으둜 두 κ°€μ§€ 기법이 μžˆλ‹€.
  1. λ©”λͺ¨μ΄μ œμ΄μ…˜(memoization)
    • λ¨Όμ € κ³„μ‚°ν•œ ν•¨μˆ˜ κ²°κ³Όλ₯Ό κΈ°μ–΅ν•΄ μž¬κ·€ ν˜ΈμΆœμ„ κ°μ†Œμ‹œν‚¨λ‹€.
  2. 상ν–₯식을 ν†΅ν•œ 동적 ν”„λ‘œκ·Έλž˜λ°

6. 상ν–₯식을 ν†΅ν•œ 동적 ν”„λ‘œκ·Έλž˜λ°

  • 이 기법은 훨씬 덜 μ„Έλ ¨λ˜κ³  심지어 기법이라고 λΆ€λ₯΄κΈ°λ„ μ• λ§€ν•˜λ‹€.
  • 상ν–₯식이 동적 ν”„λ‘œκ·Έλž˜λ°μ˜ ν•˜λ‚˜λ‘œ κ°„μ£Όλ˜λŠ” μ΄μœ λŠ” 동적 ν”„λ‘œκ·Έλž˜λ°μ΄ μž¬κ·€μ μœΌλ‘œ ν’€ 수 μžˆλŠ” λ¬Έμ œμ— λŒ€ν•΄ μ€‘μ²©λ˜λŠ” ν•˜μœ„ 문제λ₯Ό 쀑볡 ν˜ΈμΆœν•˜μ§€ μ•Šκ²Œ ν•΄μ£ΌκΈ° λ•Œλ¬Έμ΄λ‹€.
  • μž¬κ·€ λŒ€μ‹  루프λ₯Ό μ‚¬μš©ν•˜λŠ” 것도 μ΄λ ‡κ²Œ ν•˜λŠ” 방법 쀑 ν•˜λ‚˜λ‹€.

6.2 λ©”λͺ¨μ΄μ œμ΄μ…˜ λŒ€ 상ν–₯식

  • λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ 쓰더라도 μž¬κ·€κ°€ λ°˜λ³΅μ— λΉ„ν•΄ μ˜€λ²„ν—€λ“œκ°€ 더 λ“ λ‹€λŠ” 사싀을 κ°„κ³Όν•΄μ„œλŠ” μ•ˆ λœλ‹€.
  • ꡬ체적으둜 λ§ν•˜λ©΄, μž¬κ·€λ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λ“  μ»΄ν“¨ν„°λŠ” 호좜 μŠ€νƒμ— λͺ¨λ“  ν˜ΈμΆœμ„ 기둝해야 ν•˜λ―€λ‘œ λ©”λͺ¨λ¦¬λ₯Ό μ†Œλͺ¨ν•œλ‹€.
  • λ©”λͺ¨μ΄μ œμ΄μ…˜ μžμ²΄λ„ ν•΄μ‹œ ν…Œμ΄λΈ”(ν˜Ήμ€ λ°°μ—΄)을 μ‚¬μš©ν•˜λ―€λ‘œ λ§ˆμ°¬κ°€μ§€λ‘œ λ©”λͺ¨λ¦¬ 곡간을 μΆ”κ°€λ‘œ μ†Œλͺ¨ν•œλ‹€.
  • μž¬κ·€κ°€ 맀우 직관적이지 μ•Šμ€ 이상 일반적으둜 상ν–₯식을 νƒν•˜λŠ” 편이 더 λ‚«λ‹€.
  • μž¬κ·€κ°€ 더 직관적이면 μž¬κ·€λ₯Ό μ‚¬μš©ν•˜λ˜ λ©”λͺ¨μ΄μ œμ΄μ…˜μœΌλ‘œ λΉ λ₯΄κ²Œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.