๐ŸŽฒ[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์žฌ๊ท€ํ•จ์ˆ˜

์ด๊ฐ•์šฑยท2022๋…„ 10์›” 2์ผ
3

๐ŸŽฒ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
1/5
post-thumbnail

์•„ํ”ˆ ์†๊ฐ€๋ฝ(?)

1์ฃผ์ฐจ๊ฐ€ ๋๋‚˜๊ณ  ์šด์˜์ง„ ๋ถ„๋“ค์ด ์ฐธ์„ํ•˜์‹  ํ‹ฐํƒ€์ž„์—์„œ ํ•œ ๋ถ„์ด ์งˆ๋ฌธ์„ ํ•˜์…จ๋‹ค.

"์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ๋งŽ์ด ํ—ท๊ฐˆ๋ฆฌ๋Š”๋ฐ ํ˜„์—…์—์„œ๋„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋‚˜์š”?"

๋Œ€ํ‘œ๋‹˜ ๋‹ต๋ณ€.

'๋”ํ•˜๊ธฐ ๋งŽ์ด ์จ์š”?' ๊ฐ™์€ ์งˆ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ์š”. (์•„.)

์–ธ์  ๊ฐ„ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค.
์‰ฌ์šด ๋ฌธ์ œ๋“ค์„ ํ’€๋ฉด์„œ ๋ณด์˜€๋˜ ํŒจํ„ด์ด๋‚˜, ๋ฐฑํŠธ๋ž˜ํ‚น, ๋ถ„ํ• ์ •๋ณต ๊ฐ™์€ ๊ฐœ๋…๋„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.
ํŒŒ์ด์ฌ ์ฑ…(Do it! ์‹œ๋ฆฌ์ฆˆ)์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.


์žฌ๊ท€ (Recursion)

์ „์ฒด์ ์ธ ์ดํ•ด

๋‚˜๋Š” ์žฌ๊ท€๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋น„์œ ์  ์ƒํ™ฉ์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค.

  1. ์ „์ฒด ๋ฌธ์ œ์ƒํ™ฉ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ๋ฒ”์œ„๋ฅผ ๋ถ„ํ• ํ•ด์„œ ๊ฐ๊ฐ์„ ๋– ๋„˜๊ธฐ๊ฑฐ๋‚˜, ๋˜๋Š” ์ตœ์†Œ๋‹จ์œ„ ํ•˜๋‚˜๋งŒ ์ฑ™๊ธฐ๊ณ  ๋‚˜๋จธ์ง€๋ฅผ ๋‹ค์‹œ ๋– ๋„˜๊ธด๋‹ค.
  2. ๋– ๋„˜๊ธฐ๋‹ค ๋‚จ์€ ๋ฌธ์ œ์ƒํ™ฉ์ด ์ตœ์†Œ๋‹จ์œ„ ํ•˜๋‚˜๊ฐ€ ๋˜๋ฉด
    ๊ทธ๋•Œ ์•Œ๋งž์€ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ €์žฅ(์™ธ๋ถ€์— ์„ ์–ธ๋œ ๋ฐฐ์—ด, ๋ณ€์ˆ˜ ๋“ฑ์—)ํ•œ๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์€ 2๋ฒˆ์—์„œ์˜ ๋ฐ˜ํ™˜ ์ƒํ™ฉ์˜ ๋‘๊ฐ€์ง€ ์ข…๋ฅ˜๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

  • ์™ผ์ชฝ ๊ทธ๋ฆผ์€ ์ƒํ–ฅ์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ์ตœ์†Œ๋‹จ์œ„(Terminating case, Base case)์—์„œ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์„, ๋ฐ”๋กœ ์œ„ ์žฌ๊ท€ํ˜ธ์ถœ์ด ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ํ•˜๋‚˜์™€ ํ•จ๊ป˜ ๊ณ„์‚ฐํ•ด์„œ ๋‹ค์‹œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    ๊ทธ ๊ณผ์ •์ด ๋ฐ˜๋ณต๋˜๋ฉด ์ตœ์ดˆ ์žฌ๊ท€ํ˜ธ์ถœ์˜ ๋ฐ˜ํ™˜๊ฐ’์ด ์ „์ฒด ๋ฌธ์ œ์ƒํ™ฉ์˜ ํ•ด๊ฒฐ๊ฐ’์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์€ ํ•˜ํ–ฅ์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ์ „์ฒด ๋ฌธ์ œ์ƒํ™ฉ์˜ ํ•ด๊ฒฐ๊ฐ’์„ ์ €์žฅํ•˜๋Š” paramter ์ž๋ฆฌ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , ์•„๋ž˜ ์žฌ๊ท€์—๊ฒŒ ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€(๋˜๋Š” ํ•„์š”ํ•œ ์—ฐ์‚ฐ)ํ•œ ๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค. ์ด ๊ณผ์ •์ด ๋ฐ˜๋ณต๋˜๋ฉด์„œ ์žฌ๊ท€์˜ ๋ฐ‘๋ฐ”๋‹ฅ(์ตœ์†Œ๋‹จ์œ„๊นŒ์ง€ ์—ฐ์‚ฐ ์™„๋ฃŒ ๋œ ํ›„)์— ๋„์ฐฉํ–ˆ์„ ๋•Œ๋Š”, ๋ฐ”๋กœ ์œ„ ์žฌ๊ท€์—์„œ ๋ณด๋‚ด์ค€ ๊ฐ’์ด ๊ณง ์ „์ฒด ๋ฌธ์ œ์ƒํ™ฉ์˜ ํ•ด๊ฒฐ๊ฐ’์ด ๋œ๋‹ค. ๋ฐ”๋กœ ๊ทธ ๊ฐ’์ด ์žฌ๊ท€๋ฅผ ํƒˆ์ถœํ•˜๋ฉด์„œ ์—ฐ์†์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๊ฒŒ ๋˜๊ณ , ์ตœ์ดˆ ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ๋ฐ˜ํ™˜๊ฐ’์ด ์ตœ์†Œ๋‹จ์œ„์—์„œ ๋ฐ˜ํ™˜ํ•œ ๊ทธ ๊ฐ’์ด ๋œ๋‹ค.

์ฝ”๋“œ๋กœ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

# ์™ผ์ชฝ (์ƒํ–ฅ์‹)
def sumVector(A, n):
   if n == 1:
      return A[0]
   else:
      return A[n-1] + sumVector(A,n-1)

# ์˜ค๋ฅธ์ชฝ (ํ•˜ํ–ฅ์‹)
def sumVector(B, n, sum):
   if n == 0:
      return sum
   else:
      return sumVector(B,n-1,sum+B[n-1])

์˜ค๋ฅธ์ชฝ์˜ ๊ฒฝ์šฐ๋ฅผ ๊ผฌ๋ฆฌ ์žฌ๊ท€(tail recursion)๋ผ๊ณ ๋„ ํ•œ๋‹ค. ๋งŒ์•ฝ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ผฌ๋ฆฌ ์žฌ๊ท€ ์ตœ์ ํ™”๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด, ๊ผฌ๋ฆฌ ์žฌ๊ท€๋Š” ์—ฐ์†์ ์ธ ์žฌ๊ท€ ํ˜ธ์ถœ๋กœ ์ผ์–ด๋‚˜๋Š” stack์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๋‘๋ฒˆ ์ด์ƒ ํ˜ธ์ถœ ๋  ๋•Œ

์žฌ๊ท€ ํ˜ธ์ถœ์ด ํ•จ์ˆ˜ ๋‚ด์— ๋‘๋ฒˆ ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๋‹ค. ์ฑ…์—์„œ๋Š” ๋‹ค์Œ์˜ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์†Œ๊ฐœํ•œ๋‹ค.

def recur(n):
	if n > 0:
    	recur(n - 1)
        print(n)
        recur(n - 2)

์˜ค๋ฌ˜ํ•˜๊ฒŒ๋„ ์ด๋Ÿฌํ•œ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ๋น„์žฌ๊ท€์ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์—์„œ ํ•จ์ˆ˜๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ๋’ค์— ๋‚˜์˜ค๋Š” ์žฌ๊ท€

๋จผ์ € ๋’ค์— ๋‚˜์˜ค๋Š” ์žฌ๊ท€ recur(n - 2)๋ฅผ ์—†์• ๋ณด์ž. ํ•ด๋‹น ํ˜ธ์ถœ์€ ์ด๋Ÿฐ ์˜๋ฏธ์ด๋‹ค.

์ธ์ˆ˜๋กœ n-2 ์˜ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ  recur( )ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด๋ผ.

์žฌ๊ท€๋ฅผ ์—†์•ค๋‹ค๋Š” ๊ฒƒ์€ recur()ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ์—†์•ค๋‹ค๋Š” ๊ฒƒ. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์•ˆ์ด ์žˆ๋‹ค.

n์˜ ๊ฐ’์„ n -2๋กœ ์—…๋ฐ์ดํŠธ ํ•œ ํ›„, ํ•จ์ˆ˜์˜ ์‹œ์ž‘์ง€์ ์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉด ๋œ๋‹ค.

์ด๋ฅผ ์ ์šฉํ•œ ์ฝ”๋“œ์ด๋‹ค.

def recur(n):
	while n > 0:
    	recur(n - 1)
        print(n)
        n = n - 2 	# ์—…๋ฐ์ดํŠธ ํ•œํ›„, while ๋ฐ˜๋ณต๋ฌธ ๋‹ค์Œ ๋ฃจํ”„.(์‹œ์ž‘์ง€์ ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ)

2. ์•ž์— ๋‚˜์˜ค๋Š” ์žฌ๊ท€

์•ž์— ๋“ฑ์žฅํ•˜๋Š” ์žฌ๊ท€๋Š” ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋‹ค.
์™œ๋ƒํ•˜๋ฉด n๊ฐ’์„ ์—…๋ฐ์ดํŠธ(n = n - 1)ํ•˜๊ณ  ์‹œ์ž‘์ง€์ ์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉด, print(n)์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰ ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ํ˜„์žฌ ๋ฃจํ”„์˜ n์˜ ๊ฐ’์„ ์ž„์‹œ๋กœ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ recur(n - 1)์˜ ์ฒ˜๋ฆฌ๋ฅผ ๋๋‚ธ ํ›„์— ์ €์žฅํ–ˆ๋˜ n์˜ ๊ฐ’์„ ๊บผ๋‚ด print(n)ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๊ฒฐ๊ตญ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ n์˜ ๊ฐ’์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ฅผ ์ ์šฉํ•œ ์ฝ”๋“œ์ด๋‹ค.

from collections import deque
def recur(n):
	stk = deque()	# ์Šคํƒ์œผ๋กœ ์‚ฌ์šฉํ•  ๋ฑ.
	while True:
    	while n > 0:
        	stk.append(n)	# ์Šคํƒ์— n๋ถ€ํ„ฐ 1์”ฉ ์ค„์—ฌ๋‚˜๊ฐ€๋ฉด์„œ ์ €์žฅ. ํ˜„์žฌ ๋ฃจํ”„์˜ 'n'์„ ์ €์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ.
            n = n - 1
            
    	if stk:
        	n = stk.pop()
            print(n)
        	n = n - 2 	# ์—…๋ฐ์ดํŠธ ํ•œํ›„, while ๋ฐ˜๋ณต๋ฌธ ๋‹ค์Œ ๋ฃจํ”„.(์‹œ์ž‘์ง€์ ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ)
            continue	# ๋ฌดํ•œ while๋กœ ๋ณต๊ท€
        break

์Šคํƒ ์ €์žฅ ๊ณผ์ •์ด ๋๋‚˜๊ณ , stk.pop()์„ ํ†ตํ•ด ๋งจ ์œ„์˜ ๊ฐ’(๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด ๋˜๊ฒ ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 1)์„ ๊บผ๋‚ธ๋’ค, ํ”„๋ฆฐํŠธ ํ•˜๊ณ , n = n - 2๋ฅผ ํ•ด์„œ ์‹œ์ž‘์ ์œผ๋กœ ๋Œ์•„์˜ค๋ฉด ์•„๊นŒ ๊ทธ ์Šคํƒ์— ๋‹ค์‹œ ๊ฐ’๋“ค์„ ์Œ“๋Š”๋‹ค. ์ฆ‰, ํ˜ธ์ถœ ์ˆœ์„œ๊ฐ€ ์ง€์ผœ์ง€๋Š” ๊ฒƒ์ด๋‹ค.

๋ถ„ํ•  ์ •๋ณต (Divide & Conquer)

๋‚˜ํด๋ ˆ์˜น์˜ ์ „์ˆ ์—์„œ ์œ ๋ž˜ํ–ˆ๋‹ค. ๊ฐœ๊ด„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Divide an instance of a problem into one or more smaller instances.
  2. Conquer(solve) each of the smaller instances. Unless a smaller instance is sufficiently small, use recursion to do this.
  3. If necessary, combine the solutions to the smaller instances to obtain the solution to the original instance.

ํฐ ์‚ฌ์ด์ฆˆ์˜ ๋ฌธ์ œ instance๋ฅผ ์ตœ๋Œ€ํ•œ ์ž‘๊ฒŒ ๋‚˜๋ˆ„์–ด ๊ฐ๊ฐ ํ•ด๊ฒฐํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์ด ๊ฒฐ๊ณผ๋“ค์„ combineํ•œ๋‹ค. ์ตœ๋Œ€ํ•œ ์ž‘๊ฒŒ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐ ํ•˜๋Š” ๊ณผ์ •์—์„œ ์žฌ๊ท€์ ์ธ ๋ฐฉ๋ฒ•์ด ์“ฐ์ธ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ํฌ์ง€ ์•Š์€ ์‚ฌ์ด์ฆˆ์˜ ๋ฌธ์ œ์—์„œ๋Š” ์œ ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
๋Œ€ํ‘œ์ ์ธ ํ™œ์šฉ์œผ๋กœ๋Š” ์ด์ง„ ํƒ์ƒ‰, ๋ณ‘ํ•ฉ ์ •๋ ฌ, ํ€ต ์ •๋ ฌ, ํ–‰๋ ฌ ๊ณฑ์…ˆ, ์ตœ๊ทผ์ ‘ ์ ์˜ ์Œ(closest Pair Problem) ์ด ์žˆ๋‹ค.

๋ฐฑํŠธ๋ž˜ํ‚น (Backtracking)

์•„๋ž˜๋Š” N-queen ๋ฌธ์ œ์˜ ์ƒํƒœ ๊ณต๊ฐ„ ํŠธ๋ฆฌ.

๋ฐฑํŠธ๋ž˜ํ‚น(back-tracking)์ด๋ž€ ์ƒํƒœ ๊ณต๊ฐ„ ํŠธ๋ฆฌ(state space tree)๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ํƒ์ƒ‰ ๊ธฐ๋ฒ•๋“ค์ด ์žˆ๋‹ค.

0. Brute Force Method
๋ง ๊ทธ๋Œ€๋กœ ์ง์Šน๊ฐ™์ด ๋ฌด์‹ํ•˜๊ฒŒ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ๊ฒ€์‚ฌํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์กฐ๊ธˆ ์ •์ œ๋œ ๋ง๋กœ๋Š”
Solution space๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์—ฌ ํ•ด๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. instance์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘์„ ๊ฒฝ์šฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์–ด ํšจ์œจ์ ์ด๋‹ค.


1. ์™„์ „ํƒ์ƒ‰(Exhaustive Search)
๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ๊ฒ€์‚ฌํ•˜์—ฌ ํ•ด๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. Brute Force Method์˜ ์ผ์ข…์œผ๋กœ, ๊ฑฐ์˜ ๊ฐ™์€ ์˜๋ฏธ๋กœ ์“ฐ์ธ๋‹ค. ๋ณดํ†ต ์™„์ „ํƒ์ƒ‰์€ ์ˆœ์—ด์ด๋‚˜ ์กฐํ•ฉ(permutational or combinational-related)์œผ๋กœ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ „๋ถ€ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

It is a brute-force approach to deal with combinatorial problems (permutations, combinations). In this approach, we generate each element in the problem and then select the ones that satisfy all the constraints, and finally find a desired element.
...
์ถœ์ฒ˜: https://towardsdev.com/brute-force-and-exhaustive-search-f431484e5293


2. ๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking)
์™„์ „ํƒ์ƒ‰์˜ ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๊ฐ€์ง€์น˜๊ธฐ(pruning)๋ฅผ ํ•˜์—ฌ ๋” ํšจ์œจ์ ์ด๋‹ค.
์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ถ„๊ธฐ์—์„œ '๋ง‰ํžˆ๋ฉด'(= not promising ํ•˜๋ฉด = ์ด ๋ถ„๊ธฐ์˜ ํ•˜์œ„ ํƒ์ƒ‰์ด ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉด) ๊ทธ ํ•˜์œ„ ๋ถ„๊ธฐ๋ฅผ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.
promising ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. DFS(Depth-First-Search)๋กœ ๊ตฌํ˜„.


3. ๋ถ„๊ธฐ ํ•œ์ • ๊ธฐ๋ฒ•(Branch & Bound)
๋ฐฑํŠธ๋ž˜ํ‚น์—์„œ '๊ฐ€์ง€์น˜๊ธฐ'์˜ ๊ธฐ์ค€ ์ฆ‰, promisingํ•จ์ˆ˜์˜ ํŒ์ •์ด ์ƒํƒœ ๊ณต๊ฐ„ ํŠธ๋ฆฌ ๊ฐ ๋…ธ๋“œ์˜ ํ•œ์ •๊ฐ’์— ์˜์กดํ•œ๋‹ค. ๋ฐฑํŠธ๋ž˜ํ‚น ๊ธฐ๋ฒ•๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ํ•ด๋ฅผ ์ฐพ๋Š”๋‹ค. ๊ฐ€์žฅ ์šฐ์ˆ˜ํ•œ ํ•œ์ •๊ฐ’์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋Š” ์ตœ์šฐ์„  ํƒ์ƒ‰(Best First Search)์œผ๋กœ ํ•ด๋ฅผ ์ฐพ๋Š”๋‹ค. Best Fisrt Search์™€ Breadth First Search์˜ ์ฐจ์ด์ ์€ (์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ).

๋™์ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (DP : Dynamic Programming)

๋™์  ๊ณ„ํš๋ฒ•

  • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ์ž‘์€ ๋‹ต๋“ค์„ ์ฐพ์•„์„œ ๊ทธ๊ฒƒ์„ ํ™œ์šฉํ•œ๋‹ค๋Š” ์ ์—์„œ ๋™์ .
    static vs dynamic ์—์„œ์˜ dynamic๊ณผ๋Š” ๊ด€๋ จ์ด ์—†๋‹ค.

์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ (Optimal Substructure)

  • ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ , ์ž‘์€ ๋ฌธ์ œ๋“ค์˜ ๋‹ต์„ ๋ชจ์•„์„œ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”๋ชจ์ด์ œ์ด์…˜(memoization)

  • '์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ' โžก๏ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜

  • ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’ DP ํ…Œ์ด๋ธ”์—(์ฃผ๋กœ ๋ฐฐ์—ด) ์บ์‹ฑ.

  • ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๊ณผ DP๋Š” ๋ณ„๊ฐœ์˜ ๊ฐœ๋….
    ํƒ‘๋‹ค์šด ๋ฐฉ์‹์—์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ '์‚ฌ์šฉ'ํ•˜๋Š” ๊ฒƒ ๋ฟ.

ํƒ‘๋‹ค์šด(์žฌ๊ท€) vs ๋ฐ”ํ…€์—…(๋ฐ˜๋ณต๋ฌธ)

  • ํƒ‘๋‹ค์šด์˜ ์žฌ๊ท€ํ˜ธ์ถœ์—์„œ ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋งค์šฐ ๋งŽ์€ ๋ถ„๊ธฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฉ”๋ชจํ•ด๋‘” ๊ฐ’์„ ์–ป์–ด์™€์„œ ํ•˜์œ„ ๋ถ„๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๋ฐ”ํ…€์—… ๋ฐฉ์‹์—์„œ๋Š” ์ ํ™”์‹์— ์ถฉ์‹คํ•˜๊ฒŒ ๋ฐฐ์—ด์„ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค. ๋ฉ”๋ชจ์ด์ œ์ด์…˜๊ณผ๋Š” ์‚ด์ง ๋‹ค๋ฅด๋‹ค.

  • ์ „ํ˜•์  ํ˜•ํƒœ๋Š” ๋ฐ”ํ…€์—….
    ์—ฐ์Šตํ•˜๊ธฐ์—๋Š” ํƒ‘๋‹ค์šด์ด ์ข‹๋‹ค.(์ฝ”์น˜๋‹˜)

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ vs ๋ถ„ํ•  ์ •๋ณต
'๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ค‘๋ณต' ์—ฌ๋ถ€์˜ ์ฐจ์ด

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด
์—ญ์‹œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด ๊ฐ€์žฅ ์ข‹์€ ์˜ˆ์‹œ.

an=anโˆ’1+anโˆ’2,a1=1,a2=1a_n = a_n-1 + a_n-2, a_1 = 1, a_2 = 1


โฌ†๏ธ ์œ„์˜ ๊ทธ๋ฆผ์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์—†์ด ์žฌ๊ท€ํ˜ธ์ถœ์„ ๊ณ„์†ํ•˜๋Š” ๊ฒฝ์šฐ.
โฌ‡๏ธ ์•„๋ž˜๋Š” ํƒ‘๋‹ค์šด ๋ฐฉ์‹์˜ DP๋ฅผ ํ†ตํ•ด(/w ๋ฉ”๋ชจ์ด์ œ์ด์…˜) ํ•˜์œ„ ๋ถ„๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ.

๐Ÿ ํŒŒ์ด์ฌ ์ฝ”๋“œ (ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด 99๋ฒˆ์งธ ํ•ญ ๊ตฌํ•˜๊ธฐ).

# dp ํ…Œ์ด๋ธ”
d = [0] * 100

###############################################################
# ํƒ‘๋‹ค์šด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ
# ์žฌ๊ท€ํ•จ์ˆ˜์™€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์œผ๋กœ ๊ตฌํ˜„
def fibo(x):
	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

# ์ฒซ ๊ฐ’(?)
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])

์ฐธ๊ณ  ํŽ˜์ด์ง€

profile
I think I think too much.

0๊ฐœ์˜ ๋Œ“๊ธ€