3개의+제곱

모든 자연수는 네개의 자연수(0을 포함) 제곱의 합으로 표현될 수 있다. 예를 들어



그리고 어떤 자연수는 세개의 자연수(0을 포함) 제곱의 합으로 표현될 수 있다. 예를 들어



주어진 숫자 K 가 3개의 자연수(0을 포함) 제곱으로 표현될 수 있다면 그 3개의 수를 출력하고 불가능 하다면 -1을 출력하라.

Input
텍스트 파일을 입력으로 한다. (텍스트 파일은 q3_input.txt로 한다.) 텍스트 파일의 첫 행은 처리할 숫자의 개수(0 < N <= 10000)를 의미한다. 각 문장은 줄바꿈 문자로 구분하며 각 숫자는 0 보다 크고 50000 보다 작거나 같다. (0 < K <= 50000)

Output
3개의 수를 오름차순으로 정렬해서 출력한다. (Std Out) 답이 여러 개일 경우 사전순으로 정렬하여 첫번째 값만 출력한다. 표현이 불가능할 경우 -1을 출력한다.

Sample Input
3 13 15 17

Sample Output
0 2 3 -1 0 1 4

Source Code code format="java5" import java.util.Arrays; import java.util.Scanner;

public class ThreeSquare { private static final int NUM_INT = 3;

public static void main(String[] args) { Scanner scan = new Scanner(System.in);

int N = scan.nextInt;   // 테스트 케이스의 개수

for(int i = 0; i < N; i++) { int K = scan.nextInt;   // 어떤 자연수

process(K); }   }

public static void process(int K) { int rem = K;   // 나머지 int[] factors = new int[NUM_INT];   // 3개의 자연수

// 탐욕적인 방법으로 큰 수부터 구한다. for(int i = 0; i < NUM_INT; i++) { double temp = Math.floor(Math.sqrt(rem));

rem -= Math.pow(temp, 2);

factors[i] = (int) temp; }

// 3개의 자연수의 제곱으로 표현될 수 있다면 // 그 3개의 수를 출력하고 // 불가능하다면 -1을 출력하라. if(rem == 0) { // 3개의 수를 오름차순으로 정렬한다. Arrays.sort(factors);

System.out.println(factors[0] + " " + factors[1] + " " + factors[2]); }       else { System.out.println(-1); }   } } code

Comment