Dynamic Programming

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)

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

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))

Last updated