문제
https://www.acmicpc.net/problem/1699
1699번: 제곱수의 합
어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다
www.acmicpc.net
문제 풀이
자연수 N을 제곱수의 합으로 나타내야 하므로
최소 개수의 제곱수로 표현하기 위해서는
n보다 작으면서 제곱수 만큼 작은 수들 중에서
dp가 가장 작은 수를 구하면 될 것이다.
예를 들어 11의 최소 제곱수의 합을 구하려면
dp[11-9] , dp[11-4], dp[11-1] 에서 가장 작은 수를 택해서 1을 더하면 된다.
문제는 N이 커지면서 덧셈 가능한 제곱수도 많아지기 때문에
이걸 구현하는게 조금 어려웠다^.^
length= int(input())
dp=[0]*100001
square_table=[0]*317
for i in range(1,317):
dp[(i**2)] =1
square_table[i] = i**2
square=1
for i in range(1,length+1):
if(dp[i] == 1):
square = i
continue
minimum = 100001
for k in range(1,int(square**(1/2))+1):
minimum = min(dp[i-square_table[k]], minimum)
dp[i] = minimum+1
print(dp[length])
dp에 제곱수들은 미리 1을 채워넣고
square라는 변수를 통해 현재까지의 최대 제곱수를 구해서
가장 작은 dp 값을 구했다..
'알고리즘' 카테고리의 다른 글
[python] 백준 2133 : 타일 채우기 (0) | 2023.07.21 |
---|---|
[python] 백준 2579 : 계단 오르기 (0) | 2023.07.17 |
[python] 백준 1912 : 연속합 (0) | 2023.07.16 |