코딩하는 해맑은 거북이

[Python] 제곱수의 합 - 백준 (DP) 본문

코딩테스트

[Python] 제곱수의 합 - 백준 (DP)

#CJE 2023. 8. 15.
해당 글은 백준 1699번 문제 '제곱수의 합'을 다룬다.

문제

https://www.acmicpc.net/problem/1699

 

1699번: 제곱수의 합

어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다

www.acmicpc.net

 

설명

해당 문제는 DP로 해결할 수 있고, 점화식을 아래와 같이 표현된다.

현재 숫자 i에서 1~(i-1)까지 값을 j라고 했을 때, 해당 값의 제곱한 결과를 뺀 dp값 + 1이 작다면 dp값을 업데이트 해준다. 

if dp[i] > dp[i-j**2]+1:
    dp[i] = dp[i-j**2]+1   

 

코드

n = int(input())

dp = [int(1e9)]*(n+1)
dp[0] = 0
dp[1] = 1
for i in range(1, n+1):
    for j in range(1, i):
        if j**2 > i:
            break
        if dp[i] > dp[i-j**2]+1:
            dp[i] = dp[i-j**2]+1
print(dp[n])

     

 

 

Comments