코딩테스트

[BOJ 10448] 유레카 이론 (Python)

YTom 2023. 5. 9. 23:01

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

 

10448번: 유레카 이론

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

www.acmicpc.net

브론즈 1문제이다. 

 

유레카 이론은 삼각수의 합을 통해서 모든 자연수를 표현할 수 있다고 한다.

하지만 실제로 표현하지 못하는 수도 존재하는데 이러한 수를 구별하는 프로그램을 만드는 것이다. 

 

즉 , 임의의 자연수를 $T_{i} + T_{j} + T_{k}$ 또는 $T_{i} + T_{j}$ 또는 $T_{i}$ 로 표현할 수 있는 경우와 아닌경우를 구분하는 것이다. 이 문제의 해법은 생각보다 간단했다. 판별해야하는 수 자체가 최대 1000의 값으로 작은 수이고, 삼각수의 45번째 이내의 항으로 표현할 수 있으니 그냥 냅다.. 되는 수를 하나하나 찾아 내면 되는 것이다.

 

 

import sys

# 삼각수 배열
triangular_number = [(i*(i+1))//2 for i in range(1, 46)]
eureka_num = [False, True, True] + [False]*998

for i in triangular_number:
    for j in triangular_number:
        for k in triangular_number:
            if i + j + k <= 1000:
                eureka_num[i+j+k] = True

t = int(input())

for _ in range(t):
    k = int(sys.stdin.readline())
    if eureka_num[k]:
        print(1)
    else:
        print(0)