IT/ps
백준 1699번 제곱수의 합
u149_cinderella
2025. 1. 30. 14:32
해당수보다 작은 가장큰 제곱수를 찾아서 뺀뒤에 그 수를 다시 제곱수를 빼고 하는 식으로 작성하면 될것같다만
이러면 탑다운이 되어버리므로 다시 생각을 해보자
1부터 n까지 증가시키면서 각수를 제곱수로 만드는 항의 최소개수를 저장시켜놓고 불러오면 되겠다.
import sys
n=int(sys.stdin.readline().rstrip())
numbers=[]
numbers.append(0)
v=[]
v.append(0)
for i in range(1,n+1):
numbers.append(i)
v.append(0)
v[1]=1
prev_max=1
for i in range(2,n+1):
if i>=(prev_max**2):
v[i]=v[i-(prev_max**2)]+1
prev_max+=1
else:
v[i]=v[i-((prev_max-1)**2)]+1
print(v[n])
일단 이렇게 작성하고 제출해봤다
왜지??
100000의 경우 316^2+12^2이니까 2가 맞고
12의 경우 3이 나와야하는데 4가 나온다 이게 문제였다.
(4+4+4) vs (9+1+1+1)
1부터n까지 제곱수로 순회를 돌아보자
import sys
n=int(sys.stdin.readline().rstrip())
numbers=[]
numbers.append(0)
v=[]
v.append(0)
for i in range(1,n+1):
numbers.append(i)
v.append(0)
v[1]=1
prev_max=1
for i in range(2,n+1):
min_value=i
for j in range(1,i+1):
if j**2>i:
break
min_value=min(min_value,v[i-j**2]+1)
v[i]=min_value
print(v[n])
이러면 O(n√n)인가
n이 10^5니까 아슬아슬할거같은데 일단 내보자
와우...