ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BJ 1644] 소수의 연속합
    알고리즘/백준 2020. 11. 16. 14:34

    풀이방법 : 에라스토테네스의 체 + 투 포인터

    해결 : 에라스토테네스의 체를 구현 하여 2부터 N(포함) 까지 모든 수에 대해서 소수를 판별하여

    새로운 수열을 만들어 투포인터로 O(n) 시간 복잡도로 해결.

     

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string>
    
    using namespace std;
    
    bool isP(int input) {
    	for (int i = 2; i <= input / 2; i++) {
    		if (input % i == 0) {
    			return false;
    		}
    	}
    	return true;
    }
    
    void setPri(vector<bool>& isPrime) {
    	for (long long int i = 2; i * i <= isPrime.size(); i++) {
    		if (isP(i)) {
    			isPrime[i] = true;
    			int t = 2;
    			while (true) {
    				int idx = i * t;
    				if (idx > isPrime.size() - 1) {
    					break;
    				}
    				isPrime[idx] = false;
    				t++;
    			}
    		}
    	}
    }
    
    int main(void) {
    	//입출력 속도
    	cin.tie(NULL);
    	ios_base::sync_with_stdio(false);
    
    	int n;
    	cin >> n;
    
    	if (n == 1) {
    		cout << 0;
    		return 0;
    	}
    
    	vector<bool> isPrime(n + 1,true);
    
    	setPri(isPrime);
    
    	vector<int> v;
    	for (int i = 2; i < isPrime.size(); i++) {
    		if (isPrime[i]) {
    			v.push_back(i);
    		}
    	}
    
    	int s = 0;
    	int e = 0;
    	long long int sum = v[s];
    	int ret = 0;
    	while (true) {
    		if (sum < n) {
    			e++;
    			if (e == v.size()) {
    				break;
    			}
    			sum += v[e];
    		}
    		else if (sum > n) {
    			sum -= v[s];
    			s++;
    		}
    		else {
    			ret++;
    			s++;
    			e = s;
    			if (e == v.size()) {
    				break;
    			}
    			sum = v[e];			
    			//같은 케이스.
    		}
    	}
    
    	cout << ret;
    
    	return 0;
    }

     

Designed by Tistory.