๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“’ | Kotlin/๐Ÿค– | ์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Dynamic Programming)

by immgga 2024. 6. 12.

 

์ถœ์ฒ˜: unsplash.com

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๋™์  ๊ณ„ํš๋ฒ•)์€ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๋” ์ž‘์€ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๊ธฐ๋ฒ•์ด๋‹ค.

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๊ธฐ๋ฒ•:

๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋œปํ•œ๋‹ค.
์„ค๊ณ„ ๊ธฐ๋ฒ•์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ „๋žต๊ณผ ์›์น™์„ ๋œปํ•œ๋‹ค.

 

DP์™€ ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ์ฐจ์ด์ 

DP์™€ ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ์ฐจ์ด์ ์„ ์•Œ๊ธฐ ์ „์— ํ•˜ํ–ฅ์‹ ์ ‘๊ทผ๋ฒ•๊ณผ ์ƒํ–ฅ์‹ ์ ‘๊ทผ๋ฒ•์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค.

1. ํ•˜ํ–ฅ์‹(top-down) ์ ‘๊ทผ๋ฒ•๊ณผ ์ƒํ–ฅ์‹(bottom-top) ์ ‘๊ทผ๋ฒ•

ํ•˜ํ–ฅ์‹ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ์ชผ๊ฐœ์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ฃผ๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
์ƒํ–ฅ์‹ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ž‘์€ ๋ฌธ์ œ๋“ค๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ž‘์€ ๋ฌธ์ œ๋“ค์˜ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•ด ์ ์  ํฐ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•.

 

2. ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)

๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ์ค‘๋ณต๋˜๋Š” ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฒ•์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ด์ „์˜ ๊ณ„์‚ฐ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ํ•ด๋‹น ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๊ณ„์‚ฐ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๊ฒฐ๋ก 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ์ชผ๊ฐœ์„œ ๊ทธ ๋‹ต์„ ์ €์žฅํ•ด ๋‘๊ณ  ์žฌํ™œ์šฉํ•œ๋‹ค.
๊ทธ๋ž˜์„œ DP๊ฐ€ ์•„๋‹Œ ๊ธฐ์–ตํ•˜๋ฉฐ ํ’€๊ธฐ๋ผ๊ณ  ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•œ๋‹ค.

 

 

DP๋ฅผ ์™œ ์จ์•ผ ํ• ๊นŒ?

์‚ฌ์‹ค DP๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋‘ ๋ฐฉ๋ฒ•์˜ ํฐ ์ฐจ์ด์ ์€ ์ด์ „์— ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌํ™œ์šฉํ•˜๋Š๋ƒ ๋ชปํ•˜๋Š๋ƒ์˜ ์ฐจ์ด์ด๋‹ค.

๋‹จ์ˆœ ์žฌ๊ท€๋Š” ์ด์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฐ ๋ฌธ์ œ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต๋˜์–ด์„œ ๋น„ํšจ์œจ์ ์ธ ๊ณ„์‚ฐ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๊ตฌํ•˜๊ณ ์ž ํ•œ๋‹ค. ์žฌ๊ท€๋กœ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์–ธ์–ด: Kotlin

private fun fibonacci(num: Int): Int {
    if (num == 2 || num == 1) {
        resursive++
        return 1
    } else return fibonacci(num - 1) + fibonacci(num - 2)
}

num์„ 5๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ฒ˜์Œ์— 5๋ฅผ ๋ฐ›์•„์™€ 4+3์„ ๋”ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  4๋ฅผ ๋ฐ›์•„์˜จ ํ•จ์ˆ˜์—์„œ 3+2๋ฅผ, 3์„ ๋ฐ›์•„์˜จ ํ•จ์ˆ˜์—์„œ 2+1์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ด ๋˜‘๊ฐ™์€ ๊ฐ’์„ ๋‹ค์‹œ ๊ตฌํ•˜๋Š” ๋ชจ์Šต์ด๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ์žฌ๊ท€ ํ˜ธ์ถœ ํŠธ๋ฆฌ

๊ฐ™์€ ์ƒ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ 1๋ฒˆ ๊ตฌํ–ˆ๋Š”๋ฐ๋„ ์žฌ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ชจ์Šต์ด๋‹ค.

num - 1์—์„œ ๊ตฌํ•œ ๊ฐ’์„ num - 2๋ฅผ ํ•ด ๋‹ค์‹œ ๊ตฌํ•˜๊ฒŒ ๋˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

๋งŒ์•ฝ num์ด 5๊ฐ€ ์•„๋‹ˆ๋ผ 100์ด๋ผ๊ณ  ํ•˜๋ฉด ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ํšŸ์ˆ˜๋Š” ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.

 

ํ•œํŽธ ์ž‘์€ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์•ž์—์„œ ๊ณ„์‚ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ์žฌํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ๋ฐ˜๋ณตํ•  ํ•„์š” ์—†์ด 5๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ ์—†์ด 3๋ฒˆ์˜ ๋ฐ˜๋ณต๋งŒ์œผ๋กœ 5๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

 

์–ธ์ œ DP๋ฅผ ์จ์•ผ ํ• ๊นŒ?

DP๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๊ฐ€์ง€์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

1. ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ

DP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„๊ณ  ์ž‘์€ ๋ฌธ์ œ ๊ฐ’์„ ์žฌํ™œ์šฉํ•ด ํฐ ๋ฌธ์ œ์˜ ๋‹ต์„ ๊ตฌํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๋ฐ˜๋ณตํ•˜์—ฌ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

2. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ

๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ตœ์  ๊ฒฐ๊ณผ ๊ฐ’์„ ์‚ฌ์šฉํ•ด ์ „์ฒด ๋ฌธ์ œ์˜ ์ตœ์  ๊ฒฐ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด A์™€ B ์ •๊ฑฐ์žฅ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๊ณ ์ž ํ•œ๋‹ค A, B ์ •๊ฑฐ์žฅ ์‚ฌ์ด์—๋Š” X ์ •๊ฑฐ์žฅ์ด ์žˆ๋‹ค.

A -> X๋กœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ AX2์ด๊ณ , X -> B์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ BX2์ผ ๋•Œ, A -> B์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” AX2 - BX2์ด๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ ˆ๋Œ€๋กœ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

์œ„์—์„œ ์˜ˆ์‹œ๋กœ ๋“ค์—ˆ๋˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด๋„ ์ด์ „์˜ ๊ณ„์‚ฐ ๊ฐ’(๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ)์„ ํ†ตํ•ด ๋‹ต(์ „์ฒด ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ)์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ ๋งŒ์กฑ์œผ๋กœ DP๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

 

DP๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ

DP๋Š” ํŠน์ •ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ๋ฌธ์ œํ•ด๊ฒฐ์— ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ DP๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ธ์ง€ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •๊นŒ์ง€ ๋‚œ์ด๋„๊ฐ€ ์‰ฌ์šด ๊ฒƒ๋ถ€ํ„ฐ ์–ด๋ ค์šด ๊ฒƒ๊นŒ์ง€ ๋‹ค์–‘ํ•˜๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ DP๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์ด ์กด์žฌํ•œ๋‹ค.

 

  1. DP๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ธ์ง€ ํ™•์ธ(DP ์‚ฌ์šฉ ์กฐ๊ฑด ํ™•์ธ)
  2. ๋ฌธ์ œ์˜ ๋ณ€์ˆ˜ ํŒŒ์•…
  3. ๋ณ€์ˆ˜ ๊ฐ„์˜ ๊ด€๊ณ„์‹ ๋งŒ๋“ค๊ธฐ
  4. ๋ฉ”๋ชจํ•˜๊ธฐ(๋ณ€์ˆ˜์˜ ๊ฐ’์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅ)
  5. ๊ธฐ์ € ์ƒํƒœ ํŒŒ์•…ํ•˜๊ธฐ(๊ฐ€์žฅ ์ž‘์€ ๋ฌธ์ œ์˜ ์ƒํƒœ ํŒŒ์•…)
  6. ๊ตฌํ˜„ํ•˜๊ธฐ

 

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

1. Bottom-up(๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ)

์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ•ด๊ฒฐํ•˜์—ฌ ์ „์ฒด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋” ์ง๊ด€์ ์ด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฏ€๋กœ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

2. Top-down(์žฌ๊ท€ ์‚ฌ์šฉ)

ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ถ€๋ถ„์œผ๋กœ ์ชผ๊ฐœ๊ณ , ์ค‘๋ณต ๊ณ„์‚ฐ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)์„ ํ™œ์šฉํ•œ๋‹ค.

์žฌ๊ท€ ํ˜ธ์ถœ์€ ๊ตฌํ˜„์ด ๋” ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํ•„์š”ํ•œ ๋ถ€๋ถ„ ๋ฌธ์ œ๋งŒ ํ•ด๊ฒฐํ•˜๋ฏ€๋กœ ๊ณ„์‚ฐ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ์žฌ๊ท€ ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  ์ž‘์€ ๋ถ€๋ถ„ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.

 

 

DP ๋ฌธ์ œ ํ’€์–ด๋ณด๊ธฐ

ํ’€์–ด๋ณผ ๋ฌธ์ œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ 1์ด๋‹ค.

https://www.acmicpc.net/problem/24416

 

๋ฌธ์ œ์˜ ์š”๊ตฌ์‚ฌํ•ญ

 

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ๋ฐ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ์žˆ๊ณ  ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๋•Œ, ์‚ฌ์ง„์˜ 2๊ฐœ์˜ ์ฝ”๋“œ์—์„œ ์ฝ”๋“œ 1(2)๋ผ๊ณ  ์ฃผ์„ ์ณ์ ธ ์žˆ๋Š” ๋ถ€๋ถ„์ด ๋ช‡ ๋ฒˆ ์‹คํ–‰๋๋Š”์ง€ ํ™•์ธํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.

 

DP๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

  1. DP๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ธ๊ฐ€?
    => ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ๋Œ€ํ‘œ์ ์ธ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ ๋งŒ์กฑ์œผ๋กœ DP๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. ๋ฌธ์ œ์˜ ๋ณ€์ˆ˜ ํŒŒ์•…
    => ์œ„ ๋ฌธ์ œ์˜ ๋ณ€์ˆ˜๋Š” n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” n์ด๋‹ค.
  3. ๋ณ€์ˆ˜ ๊ฐ„ ๊ด€๊ณ„์‹ ๋งŒ๋“ค๊ธฐ
    => ํ•˜์œ„์˜ ๋ฐ์ดํ„ฐ๋“ค์„ ์ด์šฉํ•ด ์ƒ์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ด€๊ณ„์‹์€ f(n) = f(n-1) + f(n-2)์ด๋‹ค.
  4. ๋ฉ”๋ชจํ•˜๊ธฐ
    => ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ list์— ์ด์ „์— ํ•ด๊ฒฐํ•œ ๋ฌธ์ œ(๊ฐ’)๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
  5. ๊ธฐ์ € ์ƒํƒœ ํŒŒ์•…
    => ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์˜ ๊ฐ€์žฅ ์ž‘์€ ๋ฌธ์ œ์˜ ์ƒํƒœ๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์˜ 0๋ฒˆ์งธ, 1๋ฒˆ์งธ ๋ฐ์ดํ„ฐ์ธ 1, 1์ด๋‹ค.
  6. ๊ตฌํ˜„ํ•˜๊ธฐ
    => ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

(์Šคํฌ ์ฃผ์˜) ์–ธ์–ด: Kotlin

๋”๋ณด๊ธฐ
import java.util.Scanner

private var resursive = 0   // ์žฌ๊ท€ ํ•จ์ˆ˜ ์นด์šดํŠธ
private var loop = 0        // ๋ฐ˜๋ณต๋ฌธ ์นด์šดํŠธ
fun main() = with(Scanner(System.`in`)) {
    val number = nextInt()

    fibonacci(number)   // ์žฌ๊ท€ ํ˜ธ์ถœ

    // ๋ฐ˜๋ณต๋ฌธ
    val fibonacciList = mutableListOf(1, 1)
    for (i in 3 .. number) {
        fibonacciList.add(fibonacciList[i-2] + fibonacciList[i-3])
        loop++
    }

    println("$resursive $loop")
}

private fun fibonacci(num: Int): Int {
    if (num == 2 || num == 1) {
        resursive++
        return 1
    } else return fibonacci(num - 1) + fibonacci(num - 2)
}

๋ฐ˜๋ณต๋ฌธ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด fibonacciList์— ์ž‘์€ ๋ฐ์ดํ„ฐ(n-1, n-2 ๋ฒˆ์งธ ๊ฐ’์˜ ํ•ฉ)๋ฅผ ์ง‘์–ด๋„ฃ์–ด ๋ฉ”๋ชจํ•˜๊ธฐ๋ฅผ ์ž˜ ์ค€์ˆ˜ํ–ˆ๋‹ค.

๊ตฌํ˜„์€ ๋ฐ˜๋ณต๋ฌธ(bottom-up)๊ณผ ์žฌ๊ท€(top-down) ๋ฐฉ์‹ ๋ชจ๋‘๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

 

์ •๋ฆฌ

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ์˜€๋‹ค.

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ ์ด์ œ๋Š” ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์†์— ์ตํžˆ๋Š” ๊ณผ์ •๋งŒ ๋‚จ์•˜๋‹ค.

DP์˜ ๊ณผ์ •์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ

https://velog.io/@boyeon_jeong/%EB%8F%99%EC%A0%81%EA%B3%84%ED%9A%8D%EB%B2%95Dynamic-Programming

 

๋™์ ๊ณ„ํš๋ฒ•(Dynamic Programming)

DP, ์ฆ‰ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๋˜๋Š” ๋™์  ๊ณ„ํš๋ฒ•)์€ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๋” ์ž‘์€ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.๐Ÿ”Ž ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๊ธฐ๋ฒ•๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•1\. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•๋ฌธ์ œ

velog.io

https://hongjw1938.tistory.com/47

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ - Dynamic Programming(๋™์  ๊ณ„ํš๋ฒ•)

1. ๊ฐœ์š” DP, ์ฆ‰ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๋˜๋Š” ๋™์  ๊ณ„ํš๋ฒ•)์€ ๊ธฐ๋ณธ์ ์ธ ์•„์ด๋””์–ด๋กœ ํ•˜๋‚˜์˜ ํฐ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜์—ฌ ๋‹ค์‹œ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ

hongjw1938.tistory.com

 

728x90

๋Œ“๊ธ€