코테 준비/완전탐색
[백준] 17626. Four Squares (다시 풀어보기)
imsmile2000
2023. 1. 8. 01:50
DP로 푸니깐 무조건 시간초과가 난다....
import sys
import math
n=int(sys.stdin.readline())
dp=[0]*(n+1)
dp[1]=1
for i in range(2,n+1): #2부터 n까지
square=1e9 #무한의 수
root=int(math.sqrt(i)) #i의 제곱근
for j in range(1,root+1): #j**2<=i일때까지
square=min(square,dp[i-(j*j)]) # square=dp[i-(j*j)]
dp[i]=square+1
print(dp[n])
문장 첫째줄을 제대로 안 읽어서 못푼 문제...
라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다.
브루투포스로 풀면 된다.
import sys
import math
n=int(sys.stdin.readline())
root=int(math.sqrt(n))
def four_squares(n):
if math.sqrt(n)==root: #n이 제곱수일 경우
return 1
for i in range(1,root+1): #n-i^2이 제곱수일 경우
if int(math.sqrt(n-i**2))==math.sqrt(n-i**2):
return 2
for i in range(1,root+1): #n-i^2-j^2이 제곱수일 경우
for j in range(1,int(math.sqrt(n-i**2))+1):
if int(math.sqrt(n-i**2-j**2))==math.sqrt(n-i**2-j**2):
return 3
return 4
print(four_squares(n))