728x90
반응형
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를 이용해야겠다라는 생각이 든다!
- y를 제곱수의 합으로 표현할 때 최소개수를 dp[y]라고 하고 x를 y보다 작은 제곱수라고 가정하면 dp[y] = min(dp[y], dp[y-x] + 1)
만약 어떤 수 y가 제곱수이면 dp[y] = 1 인 것이 명백하므로 먼저 제곱수는 dp[y] = 1을 고정시키자.
for 문을 쓰면 될 것 같은데?
code
import sys
input = sys.stdin.readline
n = int(input())
dp = [x for x in range(n+1)] #x는 dp[x]의 maximum 값이다.
#왜냐하면 dp[x] = 1+1+...1 제곱수 1을 x번 더한 것으로 나타낼 수 있기 때문이다.
for i in range(n+1):
for j in range(1,i+1):
if j*j > i:
break
if dp[i] > dp[i-j*j] + 1:
dp[i] = dp[i-j*j] +1 # 참고로 문제 해결 전에는 미리 i=j*2 이면 dp[i]=1로
#고정 시킬려고 했다. 하지만 이렇게 코드를 작성하면 dp[i] = dp[0]+1 이 되므로 dp[i] = 1 이 된다.
print(dp[n])
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[Python] 백준 1309 동물원 (0) | 2022.12.25 |
---|---|
[Python] 백준 15998 1,2,3 더하기 3 (0) | 2022.12.25 |
[Python] 백준 2225 합분해 (0) | 2022.12.24 |
[Python] 백준 2193 이친수 (0) | 2022.12.22 |
[Python] 백준 25682 체스판 다시 칠하기 2 (0) | 2022.12.22 |
댓글