n = int(input())
n_list = [0] * (n+1)
n_list[1] = 1
for i in range(2, n+1):
j = 1
min_v = 4
while (j**2) <= i:
tmp = n_list[i - (j**2)] + 1
min_v = min(min_v, tmp)
j += 1
n_list[i] = min_v
print(n_list[n])
1 = 1^2
2 = 1^2 + 1^2
3 = 1^2 + 1^2 + 1^2
4 = 2^2
5 = 2^2 + 1^2
6 = 2^2 + 1^2 + 1^2
7 = 2^2 + 1^2 + 1^2 + 1^2
8 = 2^2 + 2^2
9 = 3^2
10 = 3^2 + 1^2
11 = 3^2 + 1^2 + 1^2
12 = 3^2 + 1^2 + 1^2 + 1^2
13 = 3^2 + 2^2
14 = 3^2 + 2^2 + 1^2
어떠한 규칙이 있을것 같아서 일일이 써봤다
혼자 찾아낸 것은 n 이하의 가장큰 자연수가 무조건 포함된다는 것이다
이후에는 뭘 해야될지 몰랐다
다른 블로그 참고해서 보니까
현재 인덱스 - 제곱수 + 1로 풀었다 (여기서 +1은 제곱수를 따로 더하는 것이다)
무조건 가장 큰 제곱수로 빼지 않아도 최소가 나올 수 있다는 것을 빼먹지 말자
지금 구하는 최솟값이 제곱수의 최소 개수이므로!!
문제 구해야 되는 것을 간과하지 말자
'알고리즘' 카테고리의 다른 글
[백준] 11403번 (python 파이썬)(플로이드 와샬) (0) | 2022.07.31 |
---|---|
[백준] 11286번 (python 파이썬) (0) | 2022.07.24 |
[백준] 11727번 (python 파이썬) (0) | 2022.07.06 |
[백준] 9461번 (python 파이썬) (0) | 2022.07.05 |
[백준] 9375번 (python 파이썬) (0) | 2022.07.03 |