๐Ÿ‘จโ€๐Ÿ’ป Seungineer's GitHub Contribution

๐Ÿงญ KAIST JUNGLE/Algorithm

[SW ์ •๊ธ€ 19์ผ์ฐจ] ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ถ„ํ• ์ •๋ณต๋ฒ•

seungineer = seungwoo + engineer 2024. 3. 30. 00:56

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(DP)์€ 'ํฐ ๋ฌธ์ œ๋ฅผ '์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ ๋‚˜์˜จ ํ•ด'๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ'์ด๋‹ค. ์ด๋Š” ๋ถ„ํ•  ์ •๋ณต๋ฒ•๊ณผ ์œ ์‚ฌํ•ด ๋ณด์ธ๋‹ค. ๋ถ„ํ•  ์ •๋ณต๋ฒ• ๋˜ํ•œ '์›๋ž˜ ๋ฌธ์ œ๋ฅผ ๋ช‡ ๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•˜๋ฉฐ ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐ'ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ฐพ์€ ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์›๋ž˜ ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ์ฐพ๋Š”๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด DP์™€ ์ฐจ์ด์ ์€?

 

DP๋Š” ๋ฌธ์ œ์— ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ(optimal substructure)์™€ ์ค‘๋ณต ๋ถ€๋ถ„ ๋ฌธ์ œ(overlapping subproblems)๊ฐ€ ์žˆ์„ ๋•Œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ž€, ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด๊ฐ€ ์›๋ž˜ ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด ์†์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ค‘๋ณต ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•ด ๊ฐ€๋Š” ๊ณผ์ •์—์„œ ์ค‘๋ณต๋˜๋Š”(=๋™์ผํ•œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ) ๊ฐ’์„ ๋ฐ˜๋ณตํ•ด์„œ ํ’€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์œ„ ๊ทธ๋ฆผ์€ ๋ถ„ํ•  ์ •๋ณต๋ฒ•์œผ๋กœ ํ”ผ๋ณด๋‚˜์น˜์ˆ˜์—ด์˜ ๋‹ค์„ฏ๋ฒˆ ์งธ๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ๊นŒ์ง€ ํ•„์š”ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด๋‹ค. fibo(3)์€ ๋‘ ๋ฒˆ ๊ณ„์‚ฐ๋˜๋ฉฐ fibo(2)์™€ fibo(1)์„ ๊ฐ๊ฐ ๋‘ ๋ฒˆ์”ฉ ์ด ๋„ค ๋ฒˆ ํ˜ธ์ถœํ•ด์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์‹œ๊ฐ„ ๋น„ํšจ์œจ์ ์ด๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ Overlapping Subproblem์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋Ÿฐ ๋น„ํšจ์œจ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด DP์˜ Memoization(๋ฉ”๋ชจ์ด์ œ์ด์…˜)์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Memoization(๋ฉ”๋ชจ์ด์ œ์ด์…˜) - Top-Down

F = {1:1, 2:1}

def fib2(n):
	if n in F:
    	return F[n]
    else:
    	F[n] = fib2(n-1) + fib2(n-2)
        return F[n]
print(fiv2(5))
print(F)

 

  • ๊ธฐ๋ก(์ €์žฅ)์„ ํ•ด๋‘๊ณ , ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ
๊ณ„์‚ฐํ•ด์„œ ์ด๋ฏธ ์ €์žฅํ•ด๋‘” ๊ฒƒ์€ '๋ฐ”๋กœ' ๋ฆฌํ„ดํ•˜์ž!

 

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด F dictionary์— n์ด ์žˆ์œผ๋ฉด F์˜ value ๊ฐ’์„ '๋ฐ”๋กœ' return ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์žฌ๊ท€(fib2(n-1) + fib2(n-2))๋กœ ๊ตฌํ•œ ๊ฐ’์„ F[n]์— ์ €์žฅํ•˜๊ณ , value ๊ฐ’์„ return ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 'F[n]'์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด memoization ์š”์†Œ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ค‘๋ณต ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Tabulation(ํƒ€๋ทธ๋ ˆ์ด์…˜) - Bottom-Up

F = {}

def fib3(n):
	F[1] = F[2] = 1
    for i in range(3, n+1):
    	F[i] = F[i-1] + F[i-2]
    return F[n]
print(fib3(5))
print(F)
  • ์žฌ๊ท€์‹์œผ๋กœ ์ƒํ–ฅ์‹ ํ•ด๋ฒ•์„ ์ฐพ์•„์„œ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์ค‘๋ณต ๋ถ€๋ถ„ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ
๋ฐ‘์—์„œ๋ถ€ํ„ฐ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ์Œ“์•„๊ฐ€์ž!

 

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด fib3 ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋น„์–ด ์žˆ๋Š” F dictionary๋Š” ๋ฐ˜๋ณต๋ฌธ์ด ์ง„ํ–‰๋  ์ˆ˜๋ก ๊ฐ’์ด key ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋ฉฐ ๋™์‹œ์— value ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค. ์ด๋ฅผ DP์˜ Tabulation์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

ํ•œ DP ๊ฐ•์˜ ์ž๋ฃŒ์— '๋ฌธ์ œ๋ฅผ ๋ดค์„ ๋•Œ, DP ๋ฌธ์ œ์ธ์ง€๋„ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค'๊ณ  ์จ์ ธ ์žˆ์—ˆ๋‹ค. ๋ถ€๋ถ„ ๋ฌธ์ œ๊ฐ€ ๋…๋ฆฝ์ ์ด์ง€ ์•Š๊ณ , memoization, tabulation์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด DP๊ฐ€ ์•„๋‹Œ์ง€ ์˜์‹ฌํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค.


๋ฒŒ์จ ์ •๊ธ€์—์„œ WEEK3๊ฐ€ ์‹œ์ž‘๋˜์—ˆ๋‹ค.

์‹œ๊ฐ„์ด ์ •๋ง ๋น ๋ฅด๊ฒŒ ํ˜๋Ÿฌ๊ฐ„๋‹ค.

์–ด์ œ์˜ ๋‚˜๋ณด๋‹ค ์˜ค๋Š˜ 1%๋งŒ ๋” ๋‚˜์•„์ง€์ž. 100์ผ์ด๋ฉด 2.7๋ฐฐ.