백준 코딩테스트

[백준] 유레카 이론(10448) - Java

nan2 2023. 10. 30. 17:48
반응형

문제

삼각수 Tn(n ≥ 1)는 [그림]에서와 같이 기하학적으로 일정한 모양의 규칙을 갖는 점들의 모음으로 표현될 수 있다.

[그림]

자연수 n에 대해 n ≥ 1의 삼각수 Tn는 명백한 공식이 있다.

Tn = 1 + 2 + 3 + ... + n = n(n+1)/2

1796년, 가우스는 모든 자연수가 최대 3개의 삼각수의 합으로 표현될 수 있다고 증명하였다. 예를 들어,

  • 4 = T1 + T2
  • 5 = T1 + T1 + T2
  • 6 = T2 + T2 or 6 = T3
  • 10 = T1 + T2 + T3 or 10 = T4

이 결과는 증명을 기념하기 위해 그의 다이어리에 “Eureka! num = Δ + Δ + Δ” 라고 적은것에서 유레카 이론으로 알려졌다. 꿍은 몇몇 자연수가 정확히 3개의 삼각수의 합으로 표현될 수 있는지 궁금해졌다. 위의 예시에서, 5와 10은 정확히 3개의 삼각수의 합으로 표현될 수 있지만 4와 6은 그렇지 않다.

자연수가 주어졌을 때, 그 정수가 정확히 3개의 삼각수의 합으로 표현될 수 있는지 없는지를 판단해주는 프로그램을 만들어라. 단, 3개의 삼각수가 모두 달라야 할 필요는 없다.


입력

프로그램은 표준입력을 사용한다. 테스트케이스의 개수는 입력의 첫 번째 줄에 주어진다. 각 테스트케이스는 한 줄에 자연수 K (3 ≤ K ≤ 1,000)가 하나씩 포함되어있는 T개의 라인으로 구성되어있다.


출력

프로그램은 표준출력을 사용한다. 각 테스트케이스에대해 정확히 한 라인을 출력한다. 만약 K가 정확히 3개의 삼각수의 합으로 표현될수 있다면 1을, 그렇지 않다면 0을 출력한다.


예제 입력 1 

3
10
20
1000

예제 출력 1 

1
0
1
 
 

내가 푼 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int TC = Integer.parseInt(br.readLine());
        int[] arr = new int[45];
        for (int i=0; i<arr.length; i++) {
            arr[i] = (i+1) * (i+2) / 2;
        }
        for (int t=0; t<TC; t++){
            boolean isSuccessed = false;
            int T = Integer.parseInt(br.readLine());
            for (int i=0; i<arr.length; i++) {
                for (int j=0; j<arr.length; j++) {
                    for (int k=0; k<arr.length;k++) {
                        if (arr[i] + arr[j] + arr[k] == T) {
                            isSuccessed = true;
                            break;
                        }
                    }
                }
            }
            if (isSuccessed)
                System.out.println("1");
            else
                System.out.println("0");
        }

    }
}

1. 삼각수의 값을 배열에 담는다. (n * (n + 1) / 2 공식 참고)

*** 이때, 문제에서 자연수 K의 값은 최대 1,000 이기 때문에 3개의 합이 1,000을 넘어갈 필요가 없게된다.

따라서, n * (n + 1) / 2 공식에서 n = 45이면 990으로 1,000을 넘어가지 않기 때문에 배열에는 45까지만 담아주면됨!

 

2. 3중 for문을 이용하여 값을 더한게 테스트케이스와 일치하면 1 출력, 아니면 0 출력한다.

 

 

반응형