본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 10448 유레카 이론

by 까망 하르방 2021. 7. 23.
반응형

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

Approach

완전탐색 유형 문제이다.

 

입력받는 K의 범위가 (3 ≤ K ≤ 1,000) 이기 때문에

삼각수로 구성한다면 1000 이하의 숫자 3개로 구성해야 한다.

그 이상의 수치는 의미가 없는 것이다.

- 44번째 값 = 990

- 45번째 값 = 1035

 

삼각수는 문제에서 주어진 공식으로 구할 수 있다.

void makeTriangle()
{
    for (int i = 1; i <= MAX_TRI; i++)
    {
        triangle[i] = i * (i + 1) / 2;
    }
}

 

K의 범위를 고려한다면 때문에 1~45번째까지 값들을 배열에 저장하면 된다.

배열 원소 3개로 만들 수 있는 숫자를 별도의 배열 ans[]에 처리할 수 있다.

→ 3중 for문

 50 *50 * 50 = 125,000로 제한시간 1초내로 구해진다.

▶ [알고리즘] 코딩 테스트 문제 풀 때, 시간 복잡도 계산해보기  

 

[알고리즘] 코딩 테스트 문제 풀 때, 시간 복잡도 계산해보기

시간 복잡도 계산해보기 프로그램 작성 전에 어느정도 Input Data의 범위와 Logic 시간 복잡도로 수행 시간을 어림짐작할 수 있어야 합니다. SW 알고리즘 문제에서는 크게 시간 / 공간 제한이 존재합

zoosso.tistory.com

 

ans[] 배열 크기는 삼각수의 최대값이 3번 더해지는 것보다 크게 설정하면 되는데

1035 + 1035 + 1035 < 5000 정도로 잡아서 처리.

K 한개를 입력받고 3개의 삼각수로 구성가능한지 확인하는 것보다.

삼각수 3개로 만들 수 있는 숫자를 미리 구해놓는 것이다.


#include <iostream>

using namespace std;

const int MAX_TRI = 45 + 2;
const int MAX_K = 5e3 + 2;
int triangle[MAX_TRI];
bool ans[MAX_K];
int TC, K;

void makeTriangle()
{
    for (int i = 1; i <= MAX_TRI; i++)
    {
        triangle[i] = i * (i + 1) / 2;
    }
}

void checkEureka()
{
    for (int i = 1; i <= MAX_TRI; i++)
        for (int j = 1; j <= MAX_TRI; j++)
            for (int k = 1; k <= MAX_TRI; k++)
                ans[triangle[i] + triangle[j] + triangle[k]] = true;
}

int main()
{
    // freopen("input.txt", "r", stdin);
    makeTriangle();
    checkEureka();
    scanf("%d", &TC);
    while (TC--)
    {
        scanf("%d", &K);
        printf("%d\n", ans[K] ? 1 : 0);
    }
}
반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 2231 분해합  (0) 2021.07.27
[BOJ] 백준 3085 사탕 게임  (0) 2021.07.24
[BOJ] 백준 18258 큐 2  (0) 2021.07.22
[BOJ] 백준 10845 큐  (0) 2021.07.22
[BOJ] 백준 10828 스택  (0) 2021.07.22

댓글