Thief of Wealth
Published 2019. 3. 24. 18:41
10448 유레카 이론 개발/알고리즘
시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초256 MB46422772212258.781%

문제

삼각수 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을 출력한다.


그림만 보고 당황하지 말자.

이런문제는 1000까지의 값을 다 구해놓고 3개씩 조합하여 그 값이 되는게 있는지만 체크하면된다.


import sys
import itertools
eureka_lst = [1] * 1000
for i in range(1, 1001): #미리 계산
eureka_lst[i - 1] = int(((i + 1) * i) / 2)

T = int(input())

for i in range(T):
num = int(input())
eureka = False
for j in range(1000):
if (eureka_lst[j] >= num):
for k in itertools.product(eureka_lst[:j], repeat=3): #중복있게 3번씩 뽑음
if (sum(k) == num): # 그 뽑은 놈들의 합이 num이면 유레카!
print(1)
eureka = True
break
if not eureka: # 끝까지 못찾았다면 뷁...
print(0)
break


'개발 > 알고리즘' 카테고리의 다른 글

1018 체스판 다시 칠하기  (0) 2019.03.24
2503 숫자야구  (0) 2019.03.24
3085 사탕게임  (0) 2019.03.23
2231 분해합  (0) 2019.03.22
2309 일곱난쟁이  (0) 2019.03.22
profile on loading

Loading...