알고리즘 BOJ

백준 17626 파이선 | Four squares

콘2조아 2021. 8. 29. 02:13

코드

import sys

n = int(sys.stdin.readline())
ans = 0

lst = []

# 제곱수들 모음
for i in range(1,224):
    lst.append(i**2)
l = len(lst)

# 답이 3인 경우
for i in range(l):
    for j in range(l):
        for k in range(l):
            if lst[i] + lst[j] + lst[k] == n:
                ans = 3

# 답이 2인 경우
for i in range(l):
    for j in range(l):
        if lst[i] + lst[j] == n:
            ans = 2                

# 답이 1인 경우
for i in range(l):
    if lst[i] == n:
        ans = 1            

# ans가 1, 2, 3이 아니면 ans는 무조건 4
if ans == 0:
    ans = 4

print(ans)

설명

223의 제곱이 49729여서 lst에는 1 부터 223 까지의 제곱수를 저장해 놓는다.

다음으로 답이 3, 2, 1인 경우를 나누어 모든 경우의 수를 다 돌며 답을 찾는다.

최소인 답을 구해야 함으로 순서는 답이 3, 2, 1인 경우로 찾는다.

답은 1, 2, 3, 4 중에 하나니까 마지막 조건문에서 답이 1, 2, 3이 아닌 경우 4로 설정해준다.

 

224 * 224 * 224 = 11,089,567 으로 반복문을 세 번 돌아도 시간을 초과할 정도는 아니다.

 

메모리: 124368KB

시간: 184ms

문제

https://www.acmicpc.net/problem/17626

 

17626번: Four Squares

라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1

www.acmicpc.net