๊ด€๋ฆฌ ๋ฉ”๋‰ด

DOing

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ with Python ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ with Python

mangdo 2021. 5. 23. 00:49

๐Ÿ’ก ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  ํ•„์š”ํ•œ ๊ณ„์‚ฐ ๊ฐ’์„ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ์žฌ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๊ธฐ๋ฒ•์ด๋‹ค.

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

 

  ์—ฌ๋‹ด์ด์ง€๋งŒ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ Dynamic์€ ๋™์  ํ• ๋‹น(Dynamic Allocation)์˜ Dynamic๊ณผ ์•„๋ฌด๋Ÿฐ ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค.

๋™์ ํ• ๋‹น์—์„œ Dynamic์€ 'ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋„์ค‘'์—๋ผ๋Š” ์˜๋ฏธ์ด์ง€๋งŒ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ Dynamic์€ ๊ณ ์•ˆ์ž์ธ ๋ฒจ๋งŒ(Richard E. Bellman)์ด ์—ฐ๊ตฌ์†Œ์—์„œ ํŽ€๋”ฉ์„ ๋ฐ›์œผ๋ ค๊ณ  ๋ฉ‹์žˆ๋Š” ๋‹จ์–ด๋ฅผ ์„ ํƒํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. Programming์ด๋ž€ ๋‹จ์–ด๋Š” ์ตœ์ ํ™” ์—ฐ๊ตฌ ๋ถ„์•ผ์—์„œ ์ตœ์ ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์•„๋‚ธ๋‹ค๋Š” ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ• ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

2. ์ค‘๋ณต๋œ ํ•˜์œ„ ๋ฌธ์ œ

 : ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

 


๐Ÿ’ก ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

 ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๊ฐ€ ๋ฐ”๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ํ˜„์žฌ ํ•ญ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „ ๋‘ํ•ญ์˜ ํ•ฉ์„ ๊ตฌํ•ด์•ผํ•œ๋‹ค. ์ด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ํ™”์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ์ ํ™”์‹

์ด๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

def fibo(x):
	if x==1 or x==2:
    	return 1
    return fibo(x-1) + fibo(x-2)
    
print(fibo(5))

ํ•ด๋‹น ์ฝ”๋“œ๋Š” O(2^N)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜์–ด N์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด N=30์ด๋ฉด ์•ฝ 10์–ต ๊ฐ€๋Ÿ‰์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค. f(5)์ผ๋•Œ ํ˜ธ์ถœ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ทธ๋ฆผ์„ ํ†ตํ•ด ๋™์ผํ•œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ ํ•œ๋ฒˆ ๊ณ„์‚ฐํ–ˆ์ง€๋งŒ ๊ณ„์† ํ˜ธ์ถœํ• ๋•Œ๋งˆ๋‹ค ๊ณ„์‚ฐ์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆผ์—์„œ fib(1)์€ ์ด 5๋ฒˆ, fib(2)๋Š” ์ด 3๋ฒˆ ํ˜ธ์ถœ๋˜์–ด ๊ณ„์‚ฐ๋˜์—ˆ๋‹ค. ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ด๋Ÿฌํ•œ ๋ฐ˜๋ณต์ ์ธ ๊ณ„์‚ฐ์„ ๋ฐฉ์ง€ํ•ด์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„ ๊ธฐ๋ฒ•์ด๋‹ค.

 

๐Ÿ’ก Topdown

 ํƒ‘๋‹ค์šด ๋ฐฉ์‹์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

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

 

[ ์ฝ”๋“œ: ํƒ‘๋‹ค์šด ๋ฐฉ์‹์„ ์ด์šฉํ•œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ]

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

# ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„(topdown)
def fibo(x):
  # fibo(1)=fibo(2)=0
  if x==1 or x==2:
    return 1

  # ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ์ ์žˆ๋Š” ๋ฌธ์ œ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
  if memo[x] != 0:
    return memo[x]

  # ์•„์ง ๊ณ„์‚ฐํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๋ผ๋ฉด ์ ํ™”์‹์— ๋”ฐ๋ผ์„œ ํ”ผ๋ณด๋‚˜์น˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
  memo[x] = fibo(x-1)+fibo(x-2)
  return memo[x]


print(fibo(99))

 

๐Ÿ’ก Bottom-Up

๋ณดํ…€์—… ๋ฐฉ์‹์€ ํƒ€๋ธ”๋ ˆ์ด์…˜(tabulation)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

  ํƒ€๋ธ”๋ ˆ์ด์…˜(tabulation)์ด๋ž€ ํ•˜์œ„ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ฒœ์ฒœํžˆ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ๋” ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•œ๋‹ค. ํƒ€๋ธ”๋ ˆ์ด์…˜์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด์œ ๋Š” ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ํฐ ๋ฌธ์ œ๊นŒ์ง€ ํ•˜๋‚˜ํ•˜๋‚˜ ํ…Œ์ด๋ธ”์„ ์ฑ„์›Œ๊ฐ„๋‹ค๋Š” ์˜๋ฏธ ๋•Œ๋ฌธ์ด๋‹ค. ๋ณดํ…€์—… ๋ฐฉ์‹์€ ํ•˜์œ„ ๋ฌธ์ œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋” ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ–ฅ์‹์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค. ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ „ํ˜•์ ์ธ ํ˜•ํƒœ๋Š” ๋ฐ”๋กœ ์ด ๋ณดํ…€์—… ๋ฐฉ์‹์ด๋‹ค. ๋ณดํ…€์—…๋ฐฉ์‹์€ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[ ์ฝ”๋“œ: ํƒ‘๋‹ค์šด ๋ฐฉ์‹์„ ์ด์šฉํ•œ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ]

# ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ํ•ด๊ฒฐํ•ด์„œ ์ €์žฅํ•  dpํ…Œ์ด๋ธ”
dp = [0]*100

# fibo(1)=fibo(2)=0
dp[1]=1
dp[2]=1
n=99

# ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„(bottom up)
for i in range(3, n+1):
  dp[i] = dp[i-1]+dp[i-2]

print(dp[n])

๐Ÿ’ก ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜ˆ์ œ

Q1. 1๋กœ ๋งŒ๋“ค๊ธฐ

 ์ •์ˆ˜ X๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ์ •์ˆ˜ X์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 4๊ฐ€์ง€์ด๋‹ค.

a) X๊ฐ€ 5๋กœ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€๋ฉด, 5๋กœ ๋‚˜๋ˆˆ๋‹ค.

b) X๊ฐ€ 3์œผ๋กœ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€๋ฉด, 3์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.

c) X๊ฐ€ 2๋กœ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€๋ฉด, 2๋กœ ๋‚˜๋ˆˆ๋‹ค.

d) X์—์„œ 1์„ ๋บ€๋‹ค.

 ์ •์ˆ˜ X๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์—ฐ์‚ฐ 4๊ฐœ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์„œ 1์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค. ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค

์˜ˆ๋ฅผ ๋“ค์–ด ์ •์ˆ˜๊ฐ€ 26์ด๋ผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐํ•ด์„œ 3๋ฒˆ ์—ฐ์‚ฐ์ด ์ตœ์†Ÿ๊ฐ’์ด๋‹ค.

1. 26-1=25

2. 25/5=5

3. 5/5=1

 

*์ž…๋ ฅ ์กฐ๊ฑด

์ฒซ์งธ์ค„์— ์ •์ˆ˜ X๊ฐ€ ์ฃผ์–ด์ง„๋‹ค(1<=x<=30,000)

*์ถœ๋ ฅ ์กฐ๊ฑด

์ฒซ์งธ์ค„์— ์—ฐ์‚ฐํ•˜๋Š” ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค,

 

*์ž…๋ ฅ ์˜ˆ์‹œ : 26

*์ถœ๋ ฅ ์˜ˆ์‹œ : 3

 

[๋ฌธ์ œ ์•„์ด๋””์–ด]

  ๊ทธ๋ฆฌ๋”” ๋ฌธ์ œ์™€ ๋น„์Šทํ•ด๋ณด์ด๊ฒ ์ง€๋งŒ, ๊ทธ๋ฆฌ๋”” ๋ฌธ์ œ๋กœ ํ’€๊ฒŒ๋˜๋ฉด 26์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์ง€๊ธˆ ๋‹น์žฅ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์ œ์ผ ์ข‹์€ ๋ฐฉ๋ฒ•์ธ c์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์˜€์„ ๊ฒƒ์ด๋‹ค. ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋Š” ๊ทธ๋ฆฌ๋””๋กœ ์ ‘๊ทผํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

  26์ด๋ผ๋Š” ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, f(26)์€ d์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” f(25), c์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” f(13), b์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” f(12)์˜ ์—ฐ์‚ฐ์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๊ฒŒ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

f(i)=min(f(i//5)+1, f(i//3)+1, f(i//2)+1, f(i)+1)

์ด๋Ÿฐ์‹์œผ๋กœ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณ„์‚ฐ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ–ˆ์„ ๋•Œ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[์ฝ”๋“œ]

x = int(input())

# ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ํ•ด๊ฒฐํ•ด์„œ ์ €์žฅํ•  dpํ…Œ์ด๋ธ”
dp = [0]*30001

# ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(bottom up)
for i in range(2, x+1):
  ## ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ˆ˜ํ–‰ํ•ด๋ณด๊ณ  ๊ฐ€์žฅ ์ž‘์€๊ฐ’์„ ๊ฐ€์ ธ๊ฐ„๋‹ค.

  # d์—ฐ์‚ฐ
  dp[i] = dp[i-1]+1

  # a์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ
  if i%5 ==0:
    dp[i] = min(dp[i], dp[i//5]+1)
  # b์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ
  if i%3==0:
    dp[i] = min(dp[i], dp[i//3]+1)
  # c์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ
  if i%2==0:
    dp[i] = min(dp[i], dp[i//2]+1)
  
print(dp[x])

Q2. ๊ฐœ๋ฏธ ์ „์‚ฌ

 ๋ฉ”๋šœ๊ธฐ ๋งˆ์„์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‹๋Ÿ‰์ฐฝ๊ณ ๊ฐ€ ์žˆ๋Š”๋ฐ ์‹๋Ÿ‰์ฐฝ๊ณ ๋Š” ์ผ์ง์„ ์œผ๋กœ ์ด์–ด์ ธ์žˆ๋‹ค. ๊ฐ ์‹๋Ÿ‰ ์ฐฝ๊ณ ์—๋Š” ์ •ํ•ด์ง„ ์ˆ˜์˜ ์‹๋Ÿ‰์„ ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐœ๋ฏธ์ „์‚ฌ๋Š” ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ์„œ๋‚ต์ ์œผ๋กœ ์•ฝํƒˆํ•˜์—ฌ ์‹๋Ÿ‰์„ ๋นผ์•—์„ ์˜ˆ์ •์ด๋‹ค. ์ด๋•Œ ๋ฉ”๋šœ๊ธฐ ์ •์ฐฐ๋ณ‘๋“ค์€ ์ผ์ง์„ ์ƒ์— ์กด์žฌํ•˜๋Š” ์‹๋Ÿ‰์ฐฝ๊ณ  ์ค‘์—์„œ ์„œ๋กœ ์ธ์ ‘ํ•œ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ๊ณต๊ฒฉ๋ฐ›์œผ๋ฉด ๋ฐ”๋กœ ์•Œ์•„์ฑŒ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ผ์„œ ๊ฐœ๋ฏธ์ „์‚ฌ๊ฐ€ ์ •์ฐฐ๋ณ‘์—๊ฒŒ ๋“คํ‚ค์ง€ ์•Š๊ณ  ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ์•ฝํƒˆํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œํ•œ ํ•œ์นธ ์ด์ƒ ๋–จ์–ด์ง„ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ์•ฝํƒˆํ•ด์•ผํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹๋Ÿ‰์ฐฝ๊ณ  4๊ฐœ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

1 2 3 5

์ด๋•Œ ๊ฐœ๋ฏธ์ „์‚ฌ๋Š” ๋‘๋ฒˆ์งธ ์‹๋Ÿ‰์ฐฝ๊ณ ์™€ ๋„ค๋ฒˆ์งธ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ์„ ํƒํ–ˆ์„๋•Œ ์ตœ๋Œ“๊ฐ’์ธ ์ด 8๊ฐœ์˜ ์‹๋Ÿ‰์„ ๋ฐฐ์•—์„ ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ๋ฏธ์ „์‚ฌ๋Š” ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์‹๋Ÿ‰์„ ์–ป๊ธฐ ์›ํ•œ๋‹ค. ๊ฐœ๋ฏธ์ „์‚ฌ๋ฅผ ์œ„ํ•ด ์‹๋Ÿ‰์ฐฝ๊ณ  N๊ฐœ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‹๋Ÿ‰์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

*์ž…๋ ฅ ์กฐ๊ฑด

- ์ฒซ์งธ์ค„์— ์‹๋Ÿ‰์ฐฝ๊ณ ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค.(3<=x<=100)

- ๋‘˜์งธ์ค„์— ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ๊ฐ ์‹๋Ÿ‰์ฐฝ๊ณ ์— ์ €์žฅ๋œ ์‹๋Ÿ‰์˜ ๊ฐœ์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.(0<=K<=1,000)

*์ถœ๋ ฅ ์กฐ๊ฑด

- ์ฒซ์งธ์ค„์— ๊ฐœ๋ฏธ ์ „์‚ฌ๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‹๋Ÿ‰์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค

 

*์ž…๋ ฅ์˜ˆ์‹œ

4

1 3 1 5

*์ถœ๋ ฅ์˜ˆ์‹œ

8

 

[๋ฌธ์ œ ์•„์ด๋””์–ด]

 ํ˜„์žฌ ๋ฐœ๊ฒฌํ•œ ์ตœ๋Œ€ ์‹๋Ÿ‰์ด๋ผ๊ณ  ๋ง‰ ํ„ธ์—ˆ๋‹ค๊ฐ€๋Š” ์ตœ์ ํ•ด๋ฅผ ๋ชป์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ์ด๋ฌธ์ œ๋Š” ๊ทธ๋ฆฌ๋””๋กœ๋Š” ํ’€ ์ˆ˜ ์—†๋‹ค. ํ˜„์žฌ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ํ„ธ์–ด์•ผ ํ• ์ง€ ์•ˆ ํ„ธ์–ด์•ผํ• ์ง€๋Š” ์ด์ „ ์‹๋Ÿ‰์ฐฝ๊ณ ์— ๋‹ฌ๋ ค์žˆ๋‹ค.

  ์˜ˆ๋ฅผ ๋“ค์–ด i๋ฒˆ์งธ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ํ„ธ์–ด๋„ ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ๋Š” i-1๋ฒˆ์งธ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ํ„ธ์ง€ ์•Š๊ณ  i-2๋ฒˆ์งธ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ํ„ธ์—ˆ์„ ๊ฒฝ์šฐ์ด๋‹ค.

๋ฐ˜๋Œ€๋กœ i๋ฒˆ์งธ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ํ„ธ๋ฉด์•ˆ๋˜๋Š” ๊ฒฝ์šฐ๋Š” i-1๋ฒˆ์งธ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ํ„ธ์—ˆ์„ ๊ฒฝ์šฐ์ด๋‹ค. ๊ทธ๋ž˜์„œ i๋ฒˆ์งธ ์‹๋Ÿ‰์ฐฝ๊ณ ๋ฅผ ํ„ธ์ง€์•ˆํ„ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

f(i)=max(f(i-1), f(i-2)+k(i))

  ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณ„์‚ฐ๋œ๋‹ค. ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ–ˆ์„ ๋•Œ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[์ฝ”๋“œ]

n = int(input())
food = list(map(int, input().split()))

# ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ํ•ด๊ฒฐํ•ด์„œ ์ €์žฅํ•  dpํ…Œ์ด๋ธ”
dp = [0]*100

# ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(bottom up)
dp[0] = food[0]
dp[1] = max(food[0], food[1])

for i in range(n):
  dp[i]=max(dp[i-1], dp[i-2]+food[i])

print(dp[n-1])

 

Q3. ํšจ์œจ์ ์ธ ํ™”ํ๊ตฌ์„ฑ

  N๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ํ™”ํŽ˜๊ฐ€ ์žˆ๋‹ค. ์ด ํ™”ํ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์ด์šฉํ•ด์„œ ๊ทธ ๊ฐ€์น˜์˜ ํ•ฉ์ด M์›์ด ๋˜๋„๋ก ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ ๊ฐ  ํ™”ํ๋Š” ๋ช‡๊ฐœ๋ผ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉํ•œ ํ™”ํ์˜ ๊ตฌ์„ฑ์€ ๊ฐ™์ง€๋งŒ ์ˆœ์„œ๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์€ ๊ฐ™์€ ๊ฒฝ์šฐ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 2์›, 3์› ๋‹จ์œ„์˜ ํ™”ํ๊ฐ€ ์žˆ์„ ๋•Œ๋Š” 15์›์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด 3์›์„ 5๊ฐœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ตœ์†Œํ•œ์˜ ํ™”ํ ๊ฐœ์ˆ˜์ด๋‹ค.

*์ž…๋ ฅ ์กฐ๊ฑด

- ์ฒซ์งธ์ค„์—์„œ N, M์ด ์ฃผ์–ด์ง„๋‹ค.(1<=N<=100, 1<=M<=10,000)

- ์ดํ›„์˜ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ํ™”ํ์˜ ๊ฐ€์น˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ํ™”ํ์˜ ๊ฐ€์น˜๋Š” 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

*์ถœ๋ ฅ ์กฐ๊ฑด

- ์ฒซ์งธ์ค„์—๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ X๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

- ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ž…๋ ฅ ์˜ˆ์‹œ ์ถœ๋ ฅ ์˜ˆ์‹œ
2 15
2
3
5
3 4
3
5
7
-1

 

[๋ฌธ์ œ ์•„์ด๋””์–ด]

 ์ฃผ์–ด์ง„ ํ™”ํ๋‚ด์—์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ๊ธˆ์•ก๋ถ€ํ„ฐ ํฐ ๊ธˆ์•ก๊นŒ์ง€ ํ™•์ธํ•˜๋ฉฐ ์ฐจ๋ก€๋Œ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ํ™”ํ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ์•„์•ผํ•œ๋‹ค. ๊ธˆ์•ก i๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ํ™”ํ ๊ฐœ์ˆ˜๋ฅผ f(i), ํ™”ํ ๋‹จ์œ„๋ฅผ k๋ผ๊ณ  ํ–ˆ์„๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

1) f(i-k)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ f(i) = min(f(i), f(i-k)+1)

2) f(i-k)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ f(i) = 10,001

ํ•ด๋‹น ์‹์„ ๋ชจ๋“  ํ™”ํ๋‹จ์œ„์— ๋Œ€ํ•˜์—ฌ ์ฐจ๋ก€๋Œ€๋กœ ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

์ž…๋ ฅ ์˜ˆ์‹œ1๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

(์ดˆ๊ธฐ)

์ธ๋ฑ์Šค 0 1 2 3 4 5 6
๊ฐ’ 0 10,001 10,001 10,001 10,001 10,001 10,001

1. ํ™”ํ ๋‹จ์œ„ 2์„ ํƒ

(k=2)

์ธ๋ฑ์Šค 0 1 2 3 4 5 6
๊ฐ’ 0 10,001 f(2)
=min(10,001, f(0)+1)
=1
10,001 f(4)
=min(10,001, f(2)+1)
=2
10,001 f(6)
=min(10,001, f(4)+1)
=3

2. ํ™”ํ ๋‹จ์œ„ 3 ์„ ํƒ

(k=3)

์ธ๋ฑ์Šค 0 1 2 3 4 5 6
๊ฐ’ 0 10,001 1 f(3)
=min(10,001,f(0))+1
=1
2 10,001 f(6)
=min(3, f(3)+1)
=2

ํŠนํžˆ f(6)์„ ์ฃผ์˜๊นŠ๊ฒŒ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

 

[์ฝ”๋“œ]

n, m = map(int, input().split())

money_type=[]
for _ in range(n):
  money_type.append(int(input()))

# ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ํ•ด๊ฒฐํ•ด์„œ ์ €์žฅํ•  dpํ…Œ์ด๋ธ”
dp = [10001]*(m+1)

# ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(bottom up)
dp[0]=0
# ๋ชจ๋“  ๊ธˆ์•ก์„ ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค์–ด๋ณธ๋‹ค
for i in range(n):
  # ํ™”ํ ์ข…๋ฅ˜๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ฌ์šฉํ•ด์„œ
  for j in range(money_type[i], m+1):

    # (i-k)์›์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•  ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ํ™”ํ๋กœ i์›์„ ๋งŒ๋“ ๋‹ค
    if dp[j-money_type[i]] != 10001:
      # ๋” ์ž‘์€ ๊ฐฏ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐฑ์‹ 
      dp[j] = min(dp[j], dp[j-money_type[i]]+1)

# ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
if dp[m] == 10001:
  print(-1)
else:
  print(dp[m])

 

 

 

 

์ถœ์ฒ˜ :

ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐ๋ทฐ(๋ฐ•์ƒ๊ธธ)

์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค(๋‚˜๋™๋นˆ)