문제
알고리즘
- 각 자연수를 만드는 제곱수에 최대 항의 개수를 dp에 저장한다.
- 이중 반복문을 통해 각 자연수를 만드는 제곱수에 항의 개수를 구한다.
- 각 자연수가 제곱수보다 작다면 제곱수로 항의 개수를 만들지 못하므로 반복을 멈춘다.
- 각 자연수를 만다는 제곱수에 최소 항의 개수를 구한다.
코드
pypy3 해결
# pypy3 (통과)
# python3 (시간초과)
import sys
n = int(sys.stdin.readline())
dp = [x for x in range(100001)] # 각 자연수를 만드는 제곱수에 최대 항의 개수
# 반복문을 통해 각 자연수를 확인
for i in range(1, n + 1):
# 반복문을 통해 각 자연수를 만드는 제곱수에 항의 개수를 구한다.
for j in range(1, i):
# 각 자연수가 제곱수보다 작다면 제곱수로 항의 개수를 만들지 못하므로 반복을 멈춘다.
if i < j * j:
break
# 각 자연수를 만드는 제곱수에 최소 항의 개수를 구한다.
dp[i] = min(dp[i], dp[i - j * j] + 1)
print(dp[n])
github
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 11055번(파이썬): 가장 큰 증가 부분 수열 (0) | 2021.12.13 |
---|---|
[baekjoon] 백준 2293번(파이썬): 동전 1 (0) | 2021.12.12 |
[baekjoon] 백준 9655번(파이썬): 돌 게임 (0) | 2021.12.08 |
[baekjoon] 백준 9625번(파이썬): BABBA (0) | 2021.12.07 |
[baekjoon] 백준 11057번(파이썬): 오른막 수 (0) | 2021.12.06 |