Skip to content

Commit

Permalink
2020-03-01 [Algorithm] Dynamic Programming Add
Browse files Browse the repository at this point in the history
  • Loading branch information
gyusuk committed Mar 1, 2020
1 parent 2d8966e commit 843cbe2
Showing 1 changed file with 79 additions and 0 deletions.
79 changes: 79 additions & 0 deletions Algorithm/동적 κ³„νšλ²• (Dynamic Programming).md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
## 동적 κ³„νšλ²• (Dynamic Programming)

> λ³΅μž‘ν•œ 문제λ₯Ό κ°„λ‹¨ν•œ μ—¬λŸ¬ 개의 문제둜 λ‚˜λˆ„μ–΄ ν‘ΈλŠ” 방법
<br>

ν”νžˆ λ§ν•˜λŠ” DPκ°€ λ°”λ‘œ '동적 κ³„νšλ²•'

**ν•œ 가지 문제**에 λŒ€ν•΄μ„œ, **단 ν•œ 번만 풀도둝** λ§Œλ“€μ–΄μ£ΌλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

즉, λ˜‘κ°™μ€ 연산을 λ°˜λ³΅ν•˜μ§€ μ•Šλ„λ‘ λ§Œλ“€μ–΄μ€€λ‹€. μ‹€ν–‰ μ‹œκ°„μ„ 쀄이기 μœ„ν•΄ 많이 μ΄μš©λ˜λŠ” μˆ˜ν•™μ  μ ‘κ·Ό λ°©μ‹μ˜ μ•Œκ³ λ¦¬μ¦˜μ΄λΌκ³  ν•  수 μžˆλ‹€.

<br>

동적 κ³„νšλ²•μ€ **Optimal Substructure**μ—μ„œ 효과λ₯Ό λ°œνœ˜ν•œλ‹€.

*Optimal Substructure* : 닡을 κ΅¬ν•˜κΈ° μœ„ν•΄ 이미 ν–ˆλ˜ λ˜‘κ°™μ€ 계산을 계속 λ°˜λ³΅ν•˜λŠ” 문제 ꡬ쑰

<br>

#### μ ‘κ·Ό 방식

μ»€λ‹€λž€ 문제λ₯Ό μ‰½κ²Œ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μž‘κ²Œ μͺΌκ°œμ„œ ν•΄κ²°ν•˜λŠ” 방법인 λΆ„ν•  정볡과 맀우 μœ μ‚¬ν•˜λ‹€. ν•˜μ§€λ§Œ κ°„λ‹¨ν•œ 문제둜 λ§Œλ“œλŠ” κ³Όμ •μ—μ„œ 쀑볡 여뢀에 λŒ€ν•œ 차이점이 μ‘΄μž¬ν•œλ‹€.

즉, 동적 κ³„νšλ²•μ€ κ°„λ‹¨ν•œ μž‘μ€ λ¬Έμ œλ“€ μ†μ—μ„œ '계속 λ°˜λ³΅λ˜λŠ” μ—°μ‚°'을 ν™œμš©ν•˜μ—¬ λΉ λ₯΄κ²Œ ν’€ 수 μžˆλŠ” 것이 핡심이닀.

<br>

#### 쑰건

- μž‘μ€ λ¬Έμ œμ—μ„œ 반볡이 일어남
- 같은 λ¬Έμ œλŠ” 항상 정닡이 κ°™μŒ

이 두 가지 쑰건이 μΆ©μ‘±ν•œλ‹€λ©΄, 동적 κ³„νšλ²•μ„ μ΄μš©ν•˜μ—¬ 문제λ₯Ό ν’€ 수 μžˆλ‹€.

같은 λ¬Έμ œκ°€ 항상 정닡이 κ°™κ³ , 반볡적으둜 μΌμ–΄λ‚œλ‹€λŠ” 점을 ν™œμš©ν•΄ λ©”λͺ¨μ΄μ œμ΄μ…˜(Memoization)으둜 큰 문제λ₯Ό ν•΄κ²°ν•΄λ‚˜κ°€λŠ” 것이닀.

<br>

*λ©”λͺ¨μ΄μ œμ΄μ…˜(Memoization)* : ν•œ 번 κ³„μ‚°ν•œ λ¬Έμ œλŠ” λ‹€μ‹œ κ³„μ‚°ν•˜μ§€ μ•Šλ„λ‘ μ €μž₯해두고 ν™œμš©ν•˜λŠ” 방식

> ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ—μ„œ μž¬κ·€λ₯Ό ν™œμš©ν•˜μ—¬ ν’€ 경우, 같은 연산을 계속 λ°˜λ³΅ν•¨μ„ μ•Œ 수 μžˆλ‹€.
>
> μ΄λ•Œ, λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ 톡해 같은 μž‘μ—…μ„ λ˜ν’€μ΄ ν•˜μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ν•˜λ©΄ νš¨μœ¨μ μ΄λ‹€.
```
fibonacci(5) = fibonacci(4) + fibonacci(3)
fibonacci(4) = fibonacci(3) + fibonacci(2)
fibonacci(3) = fibonacci(2) + fibonacci(1)
이처럼 같은 연산이 계속 반볡적으둜 이용될 λ•Œ, λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ ν™œμš©ν•˜μ—¬ 값을 미리 μ €μž₯해두면 효율적
```

ν”Όλ³΄λ‚˜μΉ˜ κ΅¬ν˜„μ— μž¬κ·€λ₯Ό ν™œμš©ν–ˆλ‹€λ©΄ μ‹œκ°„λ³΅μž‘λ„λŠ” O(2^n)μ΄μ§€λ§Œ, 동적 κ³„νšλ²•μ„ ν™œμš©ν•˜λ©΄ O(N)으둜 ν•΄κ²°ν•  수 μžˆλ‹€.

<br>

#### κ΅¬ν˜„ 방식

- Bottom-up : μž‘μ€ λ¬Έμ œλΆ€ν„° μ°¨κ·Όμ°¨κ·Ό κ΅¬ν•˜λŠ” 방법
- Top-down : 큰 문제λ₯Ό ν’€λ‹€κ°€ 풀리지 μ•Šμ€ μž‘μ€ λ¬Έμ œκ°€ μžˆλ‹€λ©΄ κ·Έλ•Œ ν•΄κ²°ν•˜λŠ” 방법 (μž¬κ·€ 방식)

> Bottom-up은 해결이 μš©μ΄ν•˜μ§€λ§Œ, 가독성이 떨어짐
>
> Top-down은 가독성이 μ’‹μ§€λ§Œ, μ½”λ“œ μž‘μ„±μ΄ νž˜λ“¬
<br>

동적 κ³„νšλ²•μœΌλ‘œ 문제λ₯Ό ν’€ λ•ŒλŠ”, μš°μ„  μž‘μ€ λ¬Έμ œλΆ€ν„° ν•΄κ²°ν•΄λ‚˜κ°€λ³΄λŠ” 것이 μ’‹λ‹€.

μž‘μ€ λ¬Έμ œλ“€μ„ ν’€μ–΄λ‚˜κ°€λ‹€λ³΄λ©΄ 이전에 ꡬ해둔 더 μž‘μ€ λ¬Έμ œλ“€μ΄ ν™œμš©λ˜λŠ” 것을 ν™•μΈν•˜κ²Œ λœλ‹€. 이에 λŒ€ν•œ κ·œμΉ™μ„ μ°Ύμ•˜μ„ λ•Œ **점화식**을 λ„μΆœν•΄λ‚΄μ–΄ 동적 κ³„νšλ²•μ„ μ μš©μ‹œν‚€μž

<br>

<br>

##### [참고 자료]

- [링크](https://namu.wiki/w/%EB%8F%99%EC%A0%81%20%EA%B3%84%ED%9A%8D%EB%B2%95)

0 comments on commit 843cbe2

Please sign in to comment.