์ฐธ๊ณ ์ž๋ฃŒ : ์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค (๋‚˜๋™๋นˆ ์ €)

1. ์ค‘๋ณต๋˜๋Š” ์—ฐ์‚ฐ์„ ์ค„์ด์ž

  1. ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
  2. ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์ •๋‹ต์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ•˜๋‹ค.
  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜ : DP๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ, ํ•œ ๋ฒˆ ๊ตฌํ˜„ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด๋‘๊ณ  ๊ฐ™์€ ์‹์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ”๋ชจํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. -> ํƒ‘๋‹ค์šด์—์„œ ์‚ฌ์šฉ (์บ์‹ฑ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.)
  • Top-Down : ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ DP ์ฝ”๋“œ ์ž‘์„ฑ
  • Bottom-Ip : ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์†Œ์Šค์ฝ”๋“œ ์ž‘์„ฑ (DP ํ…Œ์ด๋ธ” ์‚ฌ์šฉ) => ๊ถŒ์žฅ
  • DP ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์ฒซ ๋‹จ๊ณ„๋Š” DP ์œ ํ˜•์ธ์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

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

๋‚œ์ด๋„ ์ค‘ํ•˜

๋ฌธ์ œ

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

  1. X๊ฐ€ 5๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด, 5๋กœ ๋‚˜๋ˆˆ๋‹ค.
  2. X๊ฐ€ 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด, 3์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  3. X๊ฐ€ 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด, 2๋กœ ๋‚˜๋ˆˆ๋‹ค.
  4. 1์„ ๋บ€๋‹ค.

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

ํ•ด์„ค

์ด ๋ฌธ์ œ๋Š” ์ž˜ ์•Œ๋ ค์ง„ DP ๋ฌธ์ œ์ด๋‹ค. ์ ํ™”์‹์„ ํ† ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ž.

์ฝ”๋“œ

x = int(input())
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])

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

๋‚œ์ด๋„ ์ค‘

๋ฌธ์ œ

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

ํ•ด์„ค

a[i] = max(a[i-1], a[i-2]+k[i])

์œ„ ์ ํ™”์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ฝ”๋“œ

x = int(input())
arr = list(map(int, input().split()))
d = [0] * 100
d[0] = array[0]
d[1] = max(array[0], array[1])

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

print(d[n-1])

4. ๋ฐ”๋‹ฅ ๊ณต์‚ฌ

๋‚œ์ด๋„ ์ค‘ํ•˜

๋ฌธ์ œ

๊ฐ€๋กœ์˜ ๊ธธ์ด๊ฐ€ N, ์„ธ๋กœ ๊ธธ์ด๊ฐ€ 2์ธ ์ง์‚ฌ๊ฐํ˜•์˜ ๋ฐ”๋‹ฅ์ด ์žˆ๋‹ค. ์ด ์–‡์€ ๋ฐ”๋‹ฅ์„ 1* 2 ๋ฎ๊ฐœ, 2* 1 ๋ฎ๊ฐœ, 2*2 ๋ฅ๊ฐœ๋ฅผ ์ด์šฉํ•ด ์ฑ„์šฐ๊ณ ์ž ํ•œ๋‹ค. ๋ฐ”๋‹ฅ์„ ์ฑ„์šฐ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ตฌํ•˜์‹œ์˜ค.

ํ•ด์„ค

์ด ๋ฌธ์ œ๋„ DP ์˜ˆ์ œ์—์„œ ๋น ์งˆ ์ˆ˜ ์—†๋Š” ํƒ€์ผ๋ง ๋ฌธ์ œ ์œ ํ˜•์ด๋‹ค. ์™ผ์ชฝ๋ถ€ํ„ฐ N-2 ๋ฏธ๋งŒ์˜ ๊ธธ์ด๋Š” ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

a[i] = a[i-1] + a[i-2] * 2

์ฝ”๋“œ

x = int(input())
d = [0] * 1001
d[1] = 1
d[2] = 3

for i in range(3, n+1):
    d[i] = d[i-1] + d[i-2] * 2

print(d[n])

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

๋ฌธ์ œ

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

ํ•ด์„ค

๊ทธ๋ฆฌ๋””๋ž‘ ๋น„์Šทํ•˜์ง€๋งŒ ํฐ ํ™”ํ๊ฐ€ ์ž‘์€ ํ™”ํ์˜ ๋ฐฐ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— DP๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ฝ”๋“œ

n, m = map(int(input()))
array = []
for _ in range(n) :
    array.append(int(input()))

d = [10001] * (m+1)
d[0] = 0

for i in range(n):
    for j in range(array[i], m+1):
        if d[j-array[i]] != 10001:
            d[j] = min(d[j], d[j-array[i]]+1)

if d[m] == 10001:
    print(-1)
else : print(d[m])