Welcome! ๐Ÿ™‹โ€โ™‚๏ธ View more

Engineering ๐Ÿ’ป/Algorithm

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

DeepFlame 2022. 2. 6. 16:03

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?


ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ’€๊ณ , ์ž‘์€ ๋ฌธ์ œ์˜ ๋‹ต์„ ์žฌํ™œ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์„ ํ™œ์šฉํ•˜์—ฌ ์‹œ๊ฐ„์  ๋น„์šฉ์„ ์ค„์ด๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

๐Ÿ‘‰ ์กฐ๊ฑด

  1. ๋ถ€๋ถ„ ๋ฐ˜๋ณต ๋ฌธ์ œ: ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒฝ์šฐ
  2. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ: ๊ฐ™์€ ๋ฌธ์ œ๋Š” ๊ตฌํ•  ๋•Œ๋งˆ๋‹ค ์ •๋‹ต์ด ๊ฐ™์„ ๊ฒฝ์šฐ

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

 

 

Fibonacci ์ˆ˜์—ด


DP๋ฅผ ์„ค๋ช…ํ•  ๋•Œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด Fibonacci ์ˆ˜์—ด์ด๋‹ค. ์ด๋Š” f(n) = f(n-1) + f(n-2)์˜ ์ ํ™”์‹์„ ๊ฐ€์ง„๋‹ค. 

์•„๋ž˜ Leetcode ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์–ด๋ณผ ๊ฒƒ์ด๋‹ค. 

https://leetcode.com/problems/fibonacci-number/

 

Fibonacci Number - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

1๏ธโƒฃ ์žฌ๊ท€ํ•จ์ˆ˜ ์‚ฌ์šฉ

def fib(self, n):
    def fibo(n):
        if n == 1:
            return 1
        elif n == 2:
            return 1
        else:
            return fibo(n-1) + fibo(n-2)

    return fibo(n)

์œ„ ์ฝ”๋“œ๋ฅผ ๋„์‹ํ™”ํ•œ ์ด๋ฏธ์ง€

 

์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ํ’€๊ฒŒ ๋˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์ง€๋งŒ, ์œ„์˜ ๊ทธ๋ฆผ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์˜ ์ˆ˜๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ œ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด Runtime Error๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค. ๐Ÿ˜ฅ 

 

 

2๏ธโƒฃ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‚ฌ์šฉ

๐Ÿ’ก ์ด ๋ฌธ์ œ๋ฅผ DP๋กœ ํ’€ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ? ์œ„์˜ ์กฐ๊ฑด์„ ์ƒ๊ฐํ•ด๋ณด์ž

  1. ๋ถ€๋ถ„ ๋ฐ˜๋ณต ๋ฌธ์ œ
    fib(7)์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” fib(6)์™€ fib(5)๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  fib(6)์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” fib(5)์™€ fib(6)์ด ํ•„์š”ํ•˜๋‹ค. ์ด ๊ฒฝ์šฐ ์‚ดํŽด๋ณด๋ฉด fib(7)๊ณผ fib(6)์—์„œ fib(5)๊ฐ€ ๋ฐ˜๋ณต๋œ๋‹ค. ์ฆ‰, ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ๊ตฌ์กฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  2. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ
    fibo ์ˆ˜์—ด์˜ ๊ฒฝ์šฐ 1๋ฒˆ์งธ/2๋ฒˆ์งธ ์ˆ˜๋Š” ๊ฐ๊ฐ 1๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฉฐ 3๋ฒˆ์งธ ์ˆ˜์—ด์€ ์–ธ์ œ๋‚˜ ๊ฒฐ๊ณผ๊ฐ€ 2์ด๋‹ค. ๊ทธ ์ดํ›„๋กœ๋„ ์ด์ „์˜ ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๋”ํ•˜์—ฌ ๊ณ„์‚ฐํ•จ์œผ๋กœ fibo ์ˆ˜์—ด์—์„œ ์–ด๋–ค ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ๋‚˜ ์ˆ˜์—ด์˜ ๊ฐ’์ด ๊ฐ™๋‹ค.

 

๋ฐฉ๋ฒ•

  1. ๋ชจ๋“  ์ž‘์€ ๋ฌธ์ œ๋“ค์€ ํ•œ๋ฒˆ๋งŒ ํ‘ผ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ •๋‹ต์„ ๊ตฌํ•œ ์ž‘์€ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ๋Š” ์–ด๋”˜๊ฐ€ ์ €์žฅํ•œ๋‹ค.
  2. ๋‹ค์‹œ ๊ทธ๋ณด๋‹ค ํฐ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚˜๊ฐˆ ๋•Œ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ์•ž์„œ ์ €์žฅํ•œ ๊ฒฐ๊ณผ ๊ฐ’์„ ์ด์šฉํ•œ๋‹ค.

 

def fib(self, n):
    fibo = [None,1,1]

    if n < 3:
        return fibo[n]

    for i in range(3, n+1):
        fibo.append(fibo[i-1] + fibo[i-2])

    return fibo[n]

์„ฑ๊ณต!

 

 

Bottom-up๊ณผ Top-down


  1. Bottom-up
    • ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ตฌํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • ์†Œ์Šค์˜ ๊ฐ€๋…์„ฑ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

  2. Top-down
    • ํฐ ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๊ฐ€ ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์•„์ง ํ’€๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ทธ๋•Œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ Top-down์ด๋‹ค.
    • ์†Œ์Šค์˜ ๊ฐ€๋…์„ฑ์ด ์ฆ๊ฐ€ํ•˜์ง€๋งŒ, ์ž‘์„ฑ์ด ์กฐ๊ธˆ ์–ด๋ ต๋‹ค.

 

 

 

์ฐธ๊ณ 
https://galid1.tistory.com/507
https://kyun2da.github.io/2020/01/19/DynamicProgramming/