https://www.acmicpc.net/problem/17626
17626호: 포 스퀘어
라그랑주는 1770년에 모든 자연수가 4 이하의 제곱합으로 표현될 수 있음을 증명했습니다. 일부 자연수는 복수로 표현됩니다. 예를 들어 26은 52와 12의 합입니다. 또한 42 + 32 + 1
www.acmicpc.net

이 문제는 내가 완전히 잘못 이해하고 완전히 잘못 접근했기 때문에 잘못된 것입니다.
import math
n = int(input())
cnt = ()
while True:
# print(int(math.sqrt(n)))
if int(math.sqrt(n)) not in cnt:
cnt.append(int(math.sqrt(n)))
n -= int(math.sqrt(n)) ** 2
# print(n)
# print('------------')
if n == 0:
print(len(cnt))
break
내 코드를 보면서 n을 더할 수 있는 제곱의 수를 세었습니다. 그래서 처음에는 무엇이 잘못되었는지조차 알 수 없었습니다.
다른 사람들이 어떻게 해결했는지 살펴보니 내가 문제를 잘못 이해하고 있었다는 것을 깨달았습니다.
올바른 응답 코드
import math
n = int(input())
dp = (0, 1)
for i in range(2, n + 1):
minValue = 1e9
for j in range(1, int(math.sqrt(i)) + 1):
minValue = min(minValue, dp(i - j ** 2))
dp.append(minValue + 1)
print(dp(n))
응답 코드를 보니 dp 방식으로 해결되었습니다. dp라는 목록의 각 인덱스에 해당하는 숫자는 추가할 수 있는 사각형 수를 나타냅니다.
- 2에서 가장 작은 수의 제곱을 찾아 목록에 추가합니다.
- 얻은 값은 미래 값으로 사용됩니다.
- i의 값을 찾으면 i의 제곱근까지 dp-list를 검색하고 최소값에 +1을 더한 다음 dp(i)에 연결합니다.
DP알고리즘으로 문제를 많이 풀어본적이 없어서 설명을 읽고 풀어봐도 마음이 편치 않았습니다.