코딩 공부/백준

[백준][C++] 1544 소수의 연속합

김 정 환 2021. 2. 13. 14:25
반응형

www.acmicpc.net/problem/1644

 

1644번: 소수의 연속합

첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)

www.acmicpc.net

 

 

 

알고리즘 종류

    - 투 포인터

    - 에라토스테네스의 체

 

 

사고 과정

    1. 에라토스테네스의 체로 소수만 선별하기

    2. 선별된 소수 배열에 투 포인터

 

 

 

구현(C++)

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <vector>
#include <cmath>
 
using namespace std;
 
int num;
int answer = 0;
vector<bool> check;
vector<int> primes;
 
 
int main(void){
 
    cin >> num;
    
    check.resize(num+1true);
    
    // 에라토스테네스의 체  
    for(int i=2; i<=sqrt(num); i++){
        
        if(!check[i]) continue;
        for(int j=i*i; j<=num; j+=i){
            check[j] = false;
        }
    }
    // 소수 값만 옮겨서 저장  
    for(int i=2; i<=num; i++){
        if(check[i]) primes.push_back(i);
    }
    
    // 투 포인터  
    int left=0, right=0;
    int sum=2;
    
    while(left <= right && right < primes.size()){
 
        if(sum == num) { 
            answer ++;
            sum -= primes[left];
            left++;
        }
        else if(sum < num){
            right++;
            sum += primes[right];
        }
        else if(sum > num){
            sum -= primes[left];
            left++;
        }
    }
    
    cout << answer << endl;
}
 
 
 
cs

 

 

시행착오

    - 에라토스테네스의 체를 함수로 만들어서 모든 수를 소수로 판별하는 용도로 사용했다. 그래서 입력된 값에 대한 것만 진행하면 시간복잡도가 log log n인데 n개를 모두 해서 n log log n으로 시간이 크게 되었다. 너무 느리다는 것을 다른 사람들과 비교해보고 수정했다.

 

 

 

 

반응형

'코딩 공부 > 백준' 카테고리의 다른 글

[백준][C++] 1504 특정한 최단 경로  (0) 2021.02.14
[백준][C++] 1300 k번째 수  (0) 2021.02.13
[백준][C++] 16927 배열 돌리기 2  (0) 2021.02.12
[백준][C++] 16926 배열 돌리기 1  (0) 2021.02.11
[백준][C++] 2437 저울  (0) 2021.02.08