์ฝ”ํ…Œ

ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ - (3) ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

sueeee-e 2025. 1. 25. 17:26

๐Ÿ“๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ (๋™์  ๊ณ„ํš๋ฒ•)

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

: ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋Š” ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅํ•˜์—ฌ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ํ•จ

ํƒ‘๋‹ค์šด(ํ•˜ํ–ฅ์‹) : ์ด์ „ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ๊ธฐ๋กํ•ด๋†“๋Š” ๊ฐœ๋…(= ๋ฉ”๋ชจ์ด์ œ์ด์…˜)์„ ํ™œ์šฉ. 

๋ณดํ…€์—…(์ƒํ–ฅ์‹)

 

์กฐ๊ฑด 

- ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ

- ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ

 

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

def fibo(x): # 1,1,2,3,5,8,13...
	if x == 1 or x == 2; #์ฒซ๋ฒˆ์งธ, ๋‘๋ฒˆ์งธ ๊ฐ’์ด 1์ด๋ผ๋Š” ๊ฑธ ๋ช…์‹œ 
    	return 1
    return fibo(x - 1) + fibo(x-2)
    
print(fibo(4))

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ™œ์šฉํ•˜๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. 

# ํƒ‘๋‹ค์šด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด
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))
# ๋ณดํ…€์—… ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด
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])

 

* ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ถ„ํ•  ์ •๋ณต

๊ณตํ†ต์  : ๋ชจ๋‘ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐจ์ด์  : ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ค‘๋ณต -> ๋ถ„ํ•  ์ •๋ณต์—์„  ๋™์ผํ•œ ๋ถ€๋ถ„ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์Œ

 

EX)

# ๋ณดํ…€์—… ๋ฐฉ์‹
d = [0] * 30001 # ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•จ
for i in range( 2, x+1): # ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ 
	d[i] = d[i-1] + 1
    if i % 2 == 0:
    	d[i] = min(d[i], d[i//2] + 1)
    if i % 3 == 0:
    	d[i] = min(d[i], d[i//3] + 1)
    if i % 5 == 0:
    	d[i] = min(d[i], d[i//5] + 1)
print(d[x])
# ํšจ์œจ์ ์ธ ํ™”ํ ๊ตฌ์„ฑ

d = [10001] * (m+1) # ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ํ™”ํŽ˜ m์˜ ๋ชจ๋“  ์ธ๋ฑ์Šค ์ €์žฅ ๊ณต๊ฐ„

d[0] = 0
for i in range(n): #ํ™”ํ ๊ฐœ์ˆ˜๋งˆ๋‹ค ํ™•์ธ
	for j in range(array[i], m+1):
    	if d[i-array[i]] != 10001:
        	d[j] = min(d[j], d[j-array[i]] + 1) # ๊ธฐ์กด์˜ ๋งŒ๋“  ๋ฐฉ์‹์˜ ๊ฐœ์ˆ˜์™€ ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์€ ๊ฐ’
if d[m] == 10001: 
	print(-1)
else:
	print(d[m])

 

 

*๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด (LIS)

 

array = { 4,2,5,8,4,11,15}

result = {4,5,8,11,15} or {2,5,8,11,15}

 

dp ๊ฐ’์˜ ์˜๋ฏธ

: ํ•ด๋‹น ๊ฐ’์ด ๋งˆ์ง€๋ง‰ ์ˆ˜์—ด์ด ๋˜์—ˆ์„ ๋•Œ ์ธ๋ฑ์Šค ๊ฐ’. 

 

dp = [1] * n

for i in range(1, n):
	for j in range(0, i):
    	if array[j] < array[i]:
        	df[i] = max(dp[i], dp[j] + 1)
            
print(n - max(dp)) #์ตœ์†Œ ๋ณ‘๋ ฅ ์—ด์™ธ ์ˆ˜