πŸ“¦1644: μ†Œμˆ˜μ˜ 연속합


[μ•Œκ³ λ¦¬μ¦˜ 풀이] κ°•λ™κ·œ
Reviewed by Kade Kang (devkade12@gmail.com)
Reviewed:: 2024-02-20
문제 ν™•μΈν•˜κΈ°

풀이

  • μ—°μ†λœ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ λͺ©ν‘œκ°’을 λ§Œλ“œλŠ” 방식이기 λ•Œλ¬Έμ— μ†Œμˆ˜λ₯Ό λ¨Όμ € ꡬ해 vector μ•ˆμ— μ €μž₯ν•œλ‹€.
  • νˆ¬ν¬μΈν„° λ°©μ‹μœΌλ‘œ 늘리고 μ€„μ΄λ©΄μ„œ λͺ©ν‘œκ°’에 λ„λ‹¬ν•˜λŠ” 경우 res++ 을 ν†΅ν•΄μ„œ λͺ©ν‘œκ°’을 λ§Œλ“€ 수 μžˆλŠ” 횟수λ₯Ό κ΅¬ν•œλ‹€.
#include <iostream>
#include <vector>
#define endl '\n'
using namespace std;
 
int n, sum=0, res;
vector<int> vec;
 
void Input(){
    cin >> n;
    if(n == 1){
        cout << 0 << endl;
        exit(0);
    }
}
 
void eratos(int n){
    vector<int> prime(n+1, 1);
 
    for(int i=2; i*i<=n; ++i){
        if(prime[i]){
            for(int j=i*i; j<=n; j+=i){
                prime[j] = 0;
            }
        }
    }
    for(int i=2; i<=n; ++i){
        if(prime[i]) vec.push_back(i);
    }
}
 
void Solution(){
    eratos(n);
    int start = 0; 
    int end = 0;
    res = 0;
    while(start<=end && end<=vec.size()){
        if(sum < n){
            sum+=vec[end];
            end++;
        }
        else{
            sum-=vec[start];
            start++;
        }
        if(sum == n) res++;
    }
    cout << res << endl;
}
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
 
    Input();
    Solution();
 
    return 0;
}