본문 바로가기

Problem Solving/백준BOJ

[백준BOJ] 17626번 Four Squares.py

728x90
반응형
SMALL

 

백준 저지에서 Four Squeres를 파이썬을 통해 풀어 보았다. 

 

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

 

17626번: Four Squares

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

www.acmicpc.net

 

17626번 Four Squares.py

 

tomy9729/Algorithm

🐗 내가 직접 작성한 내 코드 🐗. Contribute to tomy9729/Algorithm development by creating an account on GitHub.

github.com

 

 

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