suvera-dev ๐Ÿฅฆ

Algorithm) Dynamic programming ๋ณธ๋ฌธ

Algorithm/CodingTest - Python

Algorithm) Dynamic programming

suvera 2022. 4. 9. 03:09

Dynamic programming(๋™์ ๊ณ„ํš๋ฒ•)์ด๋ž€ ? 

 

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰์‹œ๊ฐ„ ํšจ์œจ์„ฑ์„ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

-> ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ตœ๋Œ€ํ•œ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž‘์„ฑ !

 

๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ : ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

- n ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ = (n-1)๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ + (n-2)๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ 

- ๋‹จ, 1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ = 1,2 ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ = 1

 

# ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜ ์†Œ์Šค์ฝ”๋“œ 
def fibo(x):
    if x == 1 or x == 2:
        return 1
    return fibo(x-1) + fibo(x-2)

print(fibo(4))

-> But, ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. 

๋ฐ”๋กœ f(n) ํ•จ์ˆ˜์—์„œ n์ด ์ปค์ง€๋ฉด ์ปค์งˆ์ˆ˜๋ก ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ !

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•ด์„œ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด๋ณด์ž ! 

1. ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

2. ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์ •๋‹ต์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ•˜๋‹ค. 

 

 

โœจ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•œ ์ข…๋ฅ˜๋กœ, ํ•œ๋ฒˆ ๊ตฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—

๋ฉ”๋ชจํ•ด๋‘๊ณ  ๊ฐ™์€ ์‹์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ”๋ชจํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋ฒ•

( ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ์บ์‹ฑ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.)

 

์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์„๊นŒ? ํ•œ ๋ฒˆ ๊ตฌํ•œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•  ๋–„๋Š”

์ด๋ฏธ ๊ตฌํ•œ ์ •๋‹ต์„ ๊ทธ๋Œ€๋กœ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค !

 

# ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
d = [0] * 100

# ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ - ํƒ‘๋‹ค์šด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ
def fibo(x):
    # ์ข…๋ฃŒ ์กฐ๊ฑด (1 ํ˜น์€ 2 ์ผ๋–„ 1์„ ๋ฐ˜ํ™˜)
    if x == 1 or x == 2:
        return 1
    # ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ์  ์žˆ๋Š” ๋ฌธ์ œ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
    if d[x] != 0:
        return d[x]
    # ์•„์ง ๊ณ„์‚ฐํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๋ผ๋ฉด ์ ํ™”์‹์— ๋”ฐ๋ผ์„œ ํ”ผ๋ณด๋‚˜์น˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    d[x] = fibo(x-1) + fibo(x-2)
    return d[x]

print(fibo(99))
# ์•ž์„œ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ DP ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™” 
d = [0] * 100

# ์ฒซ ๋ฒˆ์จฐ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์™€ ๋‘ ๋ฒˆ์จฐ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 1
d[1] = 1
d[2] = 1
n = 99

# ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„ - ๋ณดํ…€์—… ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ 
for i in range(3, n+1):
    d[i] = d[i-1] + d[i-2]
    
print(d[n])

์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„

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

ํƒ‘๋‹ค์šด ๋ฐฉ์‹์ด๋ผ๊ณ  ๋งํ•œ๋‹ค.

 

๋ฐ˜๋ฉด์— ๋‹จ์ˆœํžˆ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ

์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ต์„ ๋„์ถœํ•œ๋‹ค๊ณ  ํ•˜์—ฌ ๋ณดํ…€์—… ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ „ํ˜•์ ์ธ ํ˜•ํƒœ๋Š” ๋ณดํ…€์—… ๋ฐฉ์‹ ! 

๋ณดํ…€์—… ๋ฐฉ์‹์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฐ๊ณผ ์ €์žฅ์šฉ ๋ฆฌ์ŠคํŠธ๋Š” DP ํ…Œ์ด๋ธ”์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, 

๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ํƒ‘๋‹ค์šด ๋ฐฉ์‹์— ๊ตญํ•œ๋˜์–ด ์‚ฌ์šฉ๋˜๋Š” ํ‘œํ˜„ ! 

 

 


์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ๋Š” ๋Œ€์ฒด๋กœ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ๋กœ ์ถœ์ œ๋œ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์ฒซ ๋‹จ๊ณ„๋Š” ๋‹น์—ฐ ๋ฌธ์ œ๊ฐ€ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ž„์„ ํŒŒ์•…ํ•˜๊ธฐ! 

์™„์ „ ํƒ์ƒ‰์œผ๋กœ ์˜ค๋ž˜ ๊ฑธ๋ฆด๋•Œ, ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์˜ ์ค‘๋ณต ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•ด๋ณด์ž 

 

์•ž์„œ ๋‹ค๋ฃจ์—ˆ๋˜ ์ˆ˜์—ด ์˜ˆ์ œ์ฒ˜๋Ÿผ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ ๋’ค์— ๋‚˜์ค‘์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•์„

์ ์šฉํ•ด์„œ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ• !

 

๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ๋ณดํ…€์—… ๋ฐฉ์‹์œผ๋กœ ํ•ด๋ณด์ž ! 

์‹œ์Šคํ…œ ์ƒ ์žฌ๊ท€ํ•จ์ˆ˜์˜ ์Šคํƒ ํฌ๊ธฐ๊ฐ€ ํ•œ์ •๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ

=> ๋งŒ์•ฝ ์†Œ์Šค์ฝ”๋“œ์—์„œ recursion depth ๊ด€๋ จ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, 

sys ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— setrecursionlimit() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ 

์žฌ๊ท€์ œํ•œ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์  ์ •๋„๋งŒ ๊ธฐ์–ตํ•˜์ž !!

'Algorithm > CodingTest - Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Algorithm) Dynamic Programming ๋ฌธ์ œ  (1) 2022.05.03
Algorithm ) Binary Search ๋ฌธ์ œ  (0) 2022.04.07
Algorithm) Binary Search  (0) 2022.04.07
Algorithm) Sorting ๊ธฐ๋ณธ๋ฌธ์ œ  (0) 2022.04.07
Algorithm) Sorting  (0) 2022.04.03
Comments