๐Ÿ‘พ
Algorithm
๊ธฐ์ดˆ ๊ฐœ๋…GitHubBeakjoon
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋…
    • Dynamic Programming
    • ์ˆ˜ํ•™ ๊ณต์‹
    • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰
    • Sorting
    • ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • Beakjoon
    • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰
      • ๐Ÿฅ‡[๊ทธ๋ž˜ํ”„] Gold
      • ๐Ÿฅˆ[๊ทธ๋ž˜ํ”„] Silver
    • ์™„์ „ํƒ์ƒ‰
      • ๐Ÿฅ‰[์™„์ „ ํƒ์ƒ‰] Bronze
      • ๐Ÿฅˆ[์™„์ „ ํƒ์ƒ‰] Silver
    • Dynamic Programming
      • ๐Ÿฅˆ[DP] Silver
    • Presum (๋ˆ„์ ํ•ฉ)
      • ๐Ÿผ[๋ˆ„์  ํ•ฉ] Silver
    • ๋‹จ๊ณ„๋ณ„๋กœ ํ’€๊ธฐ
      • [1๋‹จ๊ณ„] ์ž…์ถœ๋ ฅ๊ณผ ์‚ฌ์น™์—ฐ์‚ฐ
  • Programmers
  • ์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค
  • README
Powered by GitBook
On this page
  • DP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด
  • ์˜ˆ์‹œ) Fibonacci numbers
  1. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋…

Dynamic Programming

Previous์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋…Next์ˆ˜ํ•™ ๊ณต์‹

Last updated 2 years ago

DP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด

  1. Problem์ด ๋” ์ž‘์€ SubProblem์œผ๋กœ ์ชผ๊ฐœ์งˆ ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค.

  2. SubProblem์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค.

  3. ์ค‘๋ณต๋œ SubProblem์ด ๊ฒน์ณ์•ผํ•œ๋‹ค.

์˜ˆ์‹œ) Fibonacci numbers

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด F(n)=F(nโˆ’1)+F(nโˆ’2)F(n) = F(n-1) + F(n-2)F(n)=F(nโˆ’1)+F(nโˆ’2)

์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ํ”ผ๋ณด๋‚˜์น˜ ๊ตฌํ˜„

func fibonacci(_ n: Int) -> Int {
    if [0, 1].contains(n) {
        return n
    }
    
    return fibonacci(n - 1) + fibonacci(n - 2)
}

print(fibonacci(10))

Top down ๋ฐฉ์‹์˜ DP

์ฃผ์–ด์ง„ n์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด n๋ถ€ํ„ฐ n-1, n-2.. ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.

sub problem์— ๋Œ€ํ•œ ์ค‘๋ณต ๊ณ„์‚ฐ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์ง€๋งŒ, ํ•จ์ˆ˜ stack์ด ๋งŽ์ด ์Œ“์ด๊ฒŒ ๋œ๋‹ค.

var fiboArray = [0, 1]
func fibonacci(_ n: Int) -> Int {
    if fiboArray.count > n {
        return fiboArray[n]
    }
    let fibo = fibonacci(n-1) + fibonacci(n-2)
    fiboArray.append(fibo)
    return fibo
}

print(fibonacci(10))

Bottom up ๋ฐฉ์‹์˜ DP

์ฃผ์–ด์ง„ n์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด 0๋ถ€ํ„ฐ n๊นŒ์ง€ ๋ฐฐ์—ด์„ ์Œ“์•„๋‚˜๊ฐ„๋‹ค.

๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n), ์‹œ๊ฐ„๋ณต์žก๋„ O(n)์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

func fibonacci(_ n: Int) -> Int {
    if [0, 1].contains(n) {
        return n
    }
    var fiboArray = [0, 1]
    for i in 2...n {
        fiboArray.append(fiboArray[i-1] + fiboArray[i-2])
    }
    return fiboArray[n]
}

print(fibonacci(10))