Skip to content

Latest commit

ย 

History

History
85 lines (53 loc) ยท 3.33 KB

File metadata and controls

85 lines (53 loc) ยท 3.33 KB

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

์ •์˜

์ตœ์ ํ•ด๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๋งค์šฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜์—ฌ ์ค‘๋ณต ์—ฐ์‚ฐ์„ ๋ฐฉ์ง€ํ•จ์œผ๋กœ์จ ์‹œ๊ฐ„ ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•œ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด ํ•œ ๋ฌธ์ œ๋ฅผ ๋ฌด์กฐ๊ฑด ํ•œ ๋ฒˆ๋งŒ ํ’€๋„๋ก ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์‚ฌ์šฉ๋ฒ•

์–ธ์ œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€

  • ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ(ํฐ ๋ฌธ์ œ์˜ ๋ถ„ํ• )๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
    • ์ž‘์€ ๋ฌธ์ œ์™€ ํฐ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ ๋กœ์ง์ด ๊ฐ™์•„์•ผ ํ•จ
  • ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์ •๋‹ต์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผ
    • ํ•ด๊ฒฐ ๋กœ์ง์ด ์ˆœ์ˆ˜ํ•จ์ˆ˜(๋™์ผ ์ž…๋ ฅ์— ๋ฐ˜๋“œ์‹œ ๋™์ผ ์ถœ๋ ฅ์ด ๋ณด์žฅ)์— ํ•ด๋‹นํ•ด์•ผ ํ•จ

์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๋Š”๊ฐ€

์œ„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ œ๋“ค์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋“ค์€ ์ˆ˜์—ด์— ํ•ด๋‹นํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ˆ˜์—ด์€ ๊ทœ์น™์ ์œผ๋กœ ๋ฐฐ์—ด๋œ ์ˆซ์ž๋“ค์˜ ๋ชจ์ž„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด(๋ฆฌ์ŠคํŠธ)์— ์ €์žฅํ•œ๋‹ค.

๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ์˜ ์ฐจ์ด

๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ ํ€ต ์†ŒํŠธ์™€ ๊ฐ™์ด ๋ฌธ์ œ๋ฅผ ๋ถ„ํ• ํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•œ๋‹ค.

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ถ„ํ•  ์ •๋ณต์€ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ์ชผ๊ฐ ๋‹ค๋Š” ์ ์—์„œ๋Š” ๋™์ผํ•˜๋‚˜, ๋ถ„ํ• ํ•˜์—ฌ ํ•ด๊ฒฐ๋œ ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฅธ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋‹ฌ๋ฆฌ ๋ถ„ํ•  ์ •๋ณต์—์„œ๋Š” ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฅธ ๋ฌธ์ œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

๊ตฌํ˜„ - Top-Down ๋ฐฉ์‹

ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ˜ธ์ถœ

์žฌ๊ท€ ํ•จ์ˆ˜์™€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(์บ์‹ฑ)์„ ์ด์šฉํ•œ๋‹ค.

์˜ˆ์‹œ - Top-Down ๋ฐฉ์‹์„ ์ด์šฉํ•œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ๊ตฌํ˜„

MAX = 100
dp = [0] * MAX

def fibonacci(x):
    if x == 1 or x == 2:
        return 1
    if dp[x] != 0:
        return d[x]
    dp[x] = fibonacci(x - 1) + fibonacci(x - 2)
    return dp[x]

print(fibonacci(MAX - 1))

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

์ด๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ๋Š” ๋ณ„๊ฐœ์˜ ๊ธฐ๋ฒ•์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค. ์ฆ‰, Top-Down ๋ฐฉ์‹์€ ์—„๋ฐ€ํžˆ ๋งํ•˜์ž๋ฉด DP์— ํฌํ•จ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.

๊ตฌํ˜„ - Bottom-Up ๋ฐฉ์‹

์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ต์„ ํ˜ธ์ถœํ•ด ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ

๋ฐ˜๋ณต๋ฌธ๊ณผ DP ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•œ๋‹ค.

์˜ˆ์‹œ - Bottom-Up ๋ฐฉ์‹์„ ์ด์šฉํ•œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ๊ตฌํ˜„

MAX = 99
dp = [0] * (MAX + 1)  # DP ํ…Œ์ด๋ธ”

dp[1] = 1
dp[2] = 1
for i in range(3, MAX + 1):
    dp[i] = dp[i - 1] + dp[i - 2]

print(dp[MAX])

์ „ํ˜•์ ์ธ DP๋Š” Bottom-Up ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค. ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์ด๋กœ๋ถ€ํ„ฐ ๋„์ถœ๋œ ๊ฐ’์„ ํ†ตํ•ด ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์œ ํ˜•

์ˆ˜์—ดํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

  • ๋ฌธ์ œ๋ฅผ ๋ถ„ํ• ํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐํ•œ ๋ฌธ์ œ์˜ ์ผ๋ถ€๋ถ„์ด ๋‹ค๋ฅธ ์ผ๋ถ€๋ถ„์˜ ํ•ด๊ฒฐ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋ฉด ์—ฌ๊ธฐ์—์„œ ๊ทœ์น™์„ฑ์„ ์ฐพ์•„ ์ˆ˜์—ด๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์ˆ˜์—ด๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” Bottom-Up ๋ฐฉ์‹์„ ์ ์šฉํ•ด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ตฌํ˜„ ๋ฌธ์ œ์—์„œ๋„ ๋กœ์ง์„ ์ˆ˜์‹ํ™”ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋งŽ์•„ ๊ตฌํ˜„ + DP ๋ฌธ์ œ๊ฐ€ ๋งŽ์€ ๊ฒƒ ๊ฐ™๋‹ค.