πŸ“š Study/Baekjoon

[Silver I] 1699 - 제곱수의 ν•©

윰갱 2025. 4. 19. 15:03

문제

μ–΄λ–€ μžμ—°μˆ˜ N은 그보닀 μž‘κ±°λ‚˜ 같은 μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 11=32+12+12(3개 ν•­)이닀. 이런 ν‘œν˜„λ°©λ²•μ€ μ—¬λŸ¬ κ°€μ§€κ°€ 될 수 μžˆλŠ”λ°, 11의 경우 11=22+22+12+12+12(5개 ν•­)도 κ°€λŠ₯ν•˜λ‹€. 이 경우, μˆ˜ν•™μž μˆŒν¬λΌν…ŒμŠ€λŠ” “11은 3개 ν•­μ˜ 제곱수 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€.”라고 λ§ν•œλ‹€. λ˜ν•œ 11은 그보닀 적은 ν•­μ˜ 제곱수 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μ—†μœΌλ―€λ‘œ, 11을 κ·Έ ν•©μœΌλ‘œμ¨ ν‘œν˜„ν•  수 μžˆλŠ” 제곱수 ν•­μ˜ μ΅œμ†Œ κ°œμˆ˜λŠ” 3이닀.

μ£Όμ–΄μ§„ μžμ—°μˆ˜ N을 μ΄λ ‡κ²Œ μ œκ³±μˆ˜λ“€μ˜ ν•©μœΌλ‘œ ν‘œν˜„ν•  λ•Œμ— κ·Έ ν•­μ˜ μ΅œμ†Œκ°œμˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 μžμ—°μˆ˜ N이 μ£Όμ–΄μ§„λ‹€. (1 ≤ N ≤ 100,000)

좜λ ₯

μ£Όμ–΄μ§„ μžμ—°μˆ˜λ₯Ό 제곱수의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό λ•Œμ— κ·Έ 제곱수 ν•­μ˜ μ΅œμ†Œ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1 λ³΅μ‚¬

7

예제 좜λ ₯ 1 λ³΅μ‚¬

4

예제 μž…λ ₯ 2 λ³΅μ‚¬

1

예제 좜λ ₯ 2 λ³΅μ‚¬

1

예제 μž…λ ₯ 3 λ³΅μ‚¬

4

예제 좜λ ₯ 3 λ³΅μ‚¬

1

예제 μž…λ ₯ 4 λ³΅μ‚¬

11

예제 좜λ ₯ 4 λ³΅μ‚¬

3

예제 μž…λ ₯ 5 λ³΅μ‚¬

13

예제 좜λ ₯ 5 λ³΅μ‚¬

2

# 풀이 방법

일단 Nμ΄λΌλŠ” μˆ«μžλ³΄λ‹€ μž‘μ€ 제곱수λ₯Ό 담을 리슀트λ₯Ό μ •μ˜ν•΄μ•Ό ν•œλ‹€.

그리고 1~NκΉŒμ§€μ˜ 수λ₯Ό λŒλ©΄μ„œ DP리슀트λ₯Ό ν•˜λ‚˜μ”© μ±„μ›Œλ‚˜κ°„λ‹€.

κ°€μž₯ μ΅œμ•…μ˜ κ²½μš°λŠ” λ‹€ 1둜 이루어져 μžˆλŠ” κ²½μš°λ‹ˆκΉŒ d[i] = i둜 μ •μ˜ν•˜κ³ 

μ΅œμ†Ÿκ°’μ„ μ°ΎλŠ” λ°©μ‹μœΌλ‘œ μ½”λ“œλ₯Ό μ§°λ‹€


# μ½”λ“œ

# 2025-04-19 13:55-14:25
import sys
sys.stdin = open("input.txt","r")

N = int(sys.stdin.readline().strip())

square = [i*i for i in range(1,int(N**0.5)+1)]

d = [0] * (N+1)
for i in range(1, N+1):
    d[i] = i
    for s in square:
        if s > i: break
        d[i] = min(d[i], d[i-s]+1)

print(d[N])

# μ°Έκ³  (였λ₯˜ ν•΄κ²°)

d[i] μ •μ˜λ₯Ό 잘λͺ»ν–ˆλ‹€ d[s] + d[i-s]κ°€ μ•„λ‹Œλ°

# 2025-04-19 13:55-14:25
import sys
# sys.stdin = open("input.txt","r")

N = int(sys.stdin.readline().strip())

square = [i*i for i in range(1,int(N**0.5)+1)]

d = [0] * (N+1)
for i in range(1, N+1):
    if i in square:
        d[i] = 1
    else:
        for s in square:
            if s > i: break
            d[i] = min(d[i-1]+1, d[s]+d[i-s])

print(d[N])