728x90
반응형
SMALL
백준 저지에서 Four Squeres를 파이썬을 통해 풀어 보았다.
https://www.acmicpc.net/problem/17626
17626번 Four Squares
문제
라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 12으로 표현할 수도 있다. 역사적으로 암산의 명수들에게 공통적으로 주어지는 문제가 바로 자연수를 넷 혹은 그 이하의 제곱수 합으로 나타내라는 것이었다. 1900년대 초반에 한 암산가가 15663 = 1252 + 62 + 12 + 12라는 해를 구하는데 8초가 걸렸다는 보고가 있다. 좀 더 어려운 문제에 대해서는 56초가 걸렸다: 11339 = 1052 + 152 + 82 + 52.
자연수 n이 주어질 때, n을 최소 개수의 제곱수 합으로 표현하는 컴퓨터 프로그램을 작성하시오.
설명
실버 5의 문제라 쉬운 방법으로만 생각하다가 큰 코 다친 문제다. 알고리즘만 생각하면 어렵지 않은건 맞는데 시야를 너무 좁게만 생각했다.
문제에서 말하는 증명은 라그랑주 네 제곱수 정리로 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다. 자연수 n에 대해서 제곱수 합의 최소 개수를 출력해야하는데 답은 1,2,3,4 중 무조건 하나다.
그렇다면 최소 개수가 1이여야 하는 조건에 대해서 확인하고 아니라면 2이여야 하는 조건, 그것도 아니라면 3이여야 하는 조건을 확인하고 그것마저 아니라면 답은 바로 4라고 할 수 있다.
최소 개수가 1인 경우는 n의 제곱근이 정수인 경우다.
최소 개수가 2인 경우는 어떤 정수 i에 대해서 n-i^2의 제곱근이 정수인 경우다.
최소 개수가 3인 경우는 어떤 정수 i와 j에 대해서 n-i^2-j^2의 제곱근이 정수인 경우다.
위 세개의 조건에 맞지 않다면 답은 바로 4이다.
코드
#17626번 Four Squares
def sol(n) :
if int(n**0.5) == n**0.5 :
return 1
for i in range(1,int(n**0.5)+1) :
if int((n-i**2)**0.5) == (n-i**2)**0.5 :
return 2
for i in range(1,int(n**0.5)+1) :
for j in range(1,int((n-i**2)**0.5)+1) :
if int((n-i**2-j**2)**0.5) == (n-i**2-j**2)**0.5 :
return 3
return 4
if __name__ == "__main__":
n = int(input())
print(sol(n))
728x90
반응형
SMALL
'Problem Solving > 백준BOJ' 카테고리의 다른 글
[백준BOJ] 16928번 뱀과 사다리 게임.py (0) | 2021.07.11 |
---|---|
[백준BOJ] 17219번 비밀번호 찾기.py (0) | 2021.07.10 |
[백준BOJ] 9019번 DSLR.py (0) | 2021.07.08 |
[백준BOJ] 7569번 토마토.py (0) | 2021.07.07 |
[백준BOJ] 6064번 카잉 달력.py (0) | 2021.07.06 |