[초기 접근 방법]
1. dp[i] : 합이 i가 되는 제곱수들의 최소 갯수
2. 점화식
dp[n] = min(dp[n], dp[n-제곱수] + 1)
→ 제곱수가 n보다 작을 때까지 비교
[생각]
문제에서 원하는 "합이 i가 되는 제곱수들의 최소 갯수"를 dp로 정의하고 풀면 되는 문제였어서, 쉽게 풀었던 것 같다.
아.. 시간 제한이 0.5초 이길래 시간초과가 나올까 봐 상수 시간복잡도까지 구했었다
[코드]
# 풀이 시간 : 15분
# 시간복잡도 : O(N*sqrt(N)) → 1100만?
# 공간복잡도 : O(n^2)
# 참고 : -
# 점화식을 세우자.. ㅎㅎ
import math
import sys
input = sys.stdin.readline
N = int(input())
# dp[i] : 합이 i가 되는 제곱수들의 최소 갯수
# 점화식
# dp[n] = min(dp[n], dp[n-제곱수] + 1)
# 제곱수가 n보다 작을 때까지 비교
dp = [float('inf') for _ in range(N+1)]
for i in range(int(math.sqrt(N))+1):
dp[i*i] = 1
# 각 dp값 구하기
for i in range(1, N+1):
for j in range(1, int(math.sqrt(i))+1):
dp[i] = min(dp[i], dp[i-(j*j)] + 1)
print(dp[N])
'Algorithm > DP' 카테고리의 다른 글
[백준] 7579번 앱 _ Python (0) | 2024.02.23 |
---|---|
[백준] 14925번 목장 건설하기 _ Python (1) | 2024.01.30 |
[백준] 2228번 구간 나누기 _ Python (0) | 2023.11.24 |
[백준] 5557번 1학년 _ Python (1) | 2023.11.21 |
[백준] 17626번 Four Squares _ Python (0) | 2023.11.17 |