시간제한이 좀 빡빡하다.
완전탐색하면 시간초과일 가능성이 농후하다.
dp로 푸는 문제인듯하다.
가장 큰 제곱수를 구하고 그 뒤 나머지는 저장된 값을 불러오게 하면 될듯하다.
import sys
n=int(sys.stdin.readline().rstrip())
v=[0]*(n+1)
v[1]=1
v[2]=1
v[3]=1
for i in range(4,n+1):
v[i]=v[i-pow(int(i**(0.5)),2)]+1
print(v[n])
생각을 잘못했다. 일단 초기값을 안넣어도 될거같고 나올 수 있는 경우의 수중 최소값을 골라줘야한다.
예를 들어 23은 9+9+5로 해주는게 가장 갚이 낮다. 16+7로하면 5가 나온다.
import sys
n=int(sys.stdin.readline().rstrip())
v=[0]*(n+1)
for i in range(1,n+1):
result=0
for j in range(1,int(i**(0.5))+1):
if result==0:
result=v[i-pow(j,2)]+1
continue
result=min(result,v[i-pow(j,2)]+1)
v[i]=result
print(v[n])
수정했다.
당연한 말이지만 많이 느려졌다.
o(n√n)인데 안되네
pypy는 된다.
근데 o(n)으로 하는방법이 있을듯하다.
import sys
n=int(sys.stdin.readline().rstrip())
v=[0]*(n+1)
for i in range(1,n+1):
if i==1:
v[1]=1
continue
elif i==2:
v[2]=2
continue
elif i==3:
v[3]=3
continue
result=0
v[i]=min(v[i-pow(int(i**(0.5)),2)],v[i-pow(int(i**(0.5))-1,2)])+1
print(v[n])
이렇게도 해봤는데
모르겠다.
수학적으로 푸는게 아니라면 n√n이 최선이 맞는거같다.
gpt님도 그렇다고 한다.
억울하면 c++써야지
'IT > ps' 카테고리의 다른 글
백준 1541번 잃어버린 괄호 (0) | 2025.02.14 |
---|---|
백준 1012번 유기농 배추 (0) | 2025.02.14 |
백준 11659번 구간 합 구하기 4 (0) | 2025.02.14 |
백준 9461 파도반 수열 (0) | 2025.02.14 |
백준 9375번 패션왕 (0) | 2025.02.14 |