Programming/백준

[브론즈 1] 백준 10448 - 유레카 이론 (파이썬)

pental 2025. 5. 16. 12:40

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

풀이

D = [0] * 50
D[0] = 1
D[1] = 3
for i in range(1, 50):
    D[i] = D[i - 1] + i + 1

삼각수를 생성한다.

for combination in combinations(D, 3):
    if sum(combination) == N:
        found = True
        break
  • combinations(D, 3)는 중복 없이 3개를 뽑아 더한 것이 N과 같은지 확인
  • 중복이 안되기 때문에 예를 들어 (3, 3, 3) 같은 케이스는 이 조건에 안 걸림
for combination in combinations(D, 2):
    if combination[0] * 2 + combination[1] == N:
        found = True
        break
    if combination[0] + combination[1] * 2 == N:
        found = True
        break

if N % 3 == 0 and N // 3 in D:
    found = True
  • 2개 조합에서 한 쪽을 2번 더해 3개의 합 만들기
  • 혹은 하나를 3번 더한 경우도 따로 처리 (즉, 3의 배수이면서 삼각수일 때)

코드

# 백준 10448 - 유레카 이론
# 분류 : 브루트 포스

from itertools import combinations

T = int(input())

D = [0] * 50
D[0] = 1
D[1] = 3
for i in range(1, 50) :
    D[i] = D[i - 1] + i + 1

for _ in range(T) :
    N = int(input())

    found = False
    for combination in combinations(D, 3) :
        if sum(combination) == N :
            found = True
            break
    
    for combination in combinations(D, 2) :
        if combination[0] * 2 + combination[1] == N :
            found = True
            break
        if combination[0] + combination[1] * 2 == N :
            found = True
            break
    
    if N % 3 == 0 and N // 3 in D :
        found = True
    
    if found :
        print("1")
    else :
        print("0")
from itertools import combinations

T = int(input())

D = [0] * 50
D[0] = 1
for i in range(1, 50) :
    D[i] = D[i - 1] + i + 1

E = [[False] * 4 for _ in range(1001)]
E[0][0] = True
for i in range(1, 1001) :
    for j in range(1, 4) :
        E[i][j] = False

        for k in D :
            if i < k :
                break
            E[i][j] |= E[i - k][j - 1]

for _ in range(T) :
    N = int(input())

    if E[N][3] :
        print("1")
    else :
        print("0")