1699번: 제곱수의 합
어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다
www.acmicpc.net
- 이전 단계의 최솟값들을 저장해놓고 단계별로 구해나간다.
- i 값의 최소 개수를 구하기 위해, 우선 i 보다 작은 제곱값들을 전부 구해놓는다.
- 각각의 제곱값들에 대해서, 이전에 구해놨던 (i - 제곱값) 들 중 최소 개수를 택하고, 제곱값 1개를 더한 값이 최소개수가 된다.
- 비효율적인 코드 같다. 채점시간도 꽤나 걸렸다.
- 배열로 하나하나 저장할 필요 없이 재귀를 통해서도 구할 수 있는 것 같다.
import math
n = int(input())
arr = [0, 1, 2, 3] + [0] * (n - 3)
for i in range(1, math.ceil(math.sqrt(n))): # 제곱수들은 1로 처리
arr[i ** 2] = 1
for i in range(4, n+1): # 나머지 수에 대해서
val = math.floor(math.sqrt(i)) # 자신보다 작은 수들 중 모든 제곱값들에 대하여
arr[i] = 1 + min(arr[i - x**2] for x in range(1, val+1)) # (제곱값을 뺀 값의 최소개수) + 1 이 최솟값이 됨
print(arr[n])
'PS > BOJ' 카테고리의 다른 글
[백준] 7562 : 나이트의 이동 (0) | 2021.01.17 |
---|---|
[백준] 2346 : 풍선 터뜨리기 (0) | 2021.01.16 |
[백준] 11052 : 카드 구매하기 (0) | 2020.12.30 |
[백준] 1261 : 알고스팟 (0) | 2020.12.29 |
[백준] 1987.cpp : 알파벳 (0) | 2020.12.28 |