문제출처: https://www.acmicpc.net/problem/17206


풀이

그냥 단순히 3또는 7의 배수인 수를 구해서 정답을 구하면 100%시간초과가 뜹니다.

테스트케이스가 최대 10만번인데 입력범위가 최대 8만 까지이므로

T가 10만이고 모든 테스트케이스의 N이 8만인 최악의 경우 최대 80억번 연산을 해야합니다.

따라서 저는 연산 전 미리 10만까지의 수에 대해 배열에 그 값까지의 합을 구해놓고 풀었습니다.

예를들어 N이 49면 temp[49]는 3부터 49까지의 수 중 3또는 7의 배수일 때 그 수들의 합을 미리 저장해서 답만 출력시키게끔 했습니다.

이렇게 하면 최대 연산횟수를 80억번에서 18만번으로 떡락시킬 수 있습니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream>
#include<algorithm>
using namespace std;
int arr[100001];
int main()
{
    cin.tie(0);
    cin.sync_with_stdio(false);
    int t, temp=0, sum = 0;
    for (int i = 3; i <= 80000; i++)
    {
        if (i % 3 == 0 && i % 7 == 0)
        {
            temp += i;
        }
        else if (i % 3 == 0)
        {
            temp += i;
 
        }
        else if (i % 7 == 0)
            temp += i;
        arr[i] = temp;
    }
    cin >> t;
    for (int i = 0; i < t; i++)
    {
        cin >> temp;
        cout << arr[temp] << '\n';
    }
 
}
cs


결과



'문제풀이(BOJ) > 수학' 카테고리의 다른 글

[백준 2981] 검문  (0) 2020.08.27
[백준 13301] 타일 장식물  (0) 2020.03.11
[백준 11051] 이항 계수 2  (0) 2020.02.10
[백준 1339] 단어 수학  (0) 2020.02.09
[백준 11444] 피보나치 수6  (0) 2020.01.19

+ Recent posts