coding_test/programmers

lv1 / 소수 만들기 / C++

CodeJin 2022. 6. 29. 16:29

https://programmers.co.kr/learn/courses/30/lessons/12977

 

코딩테스트 연습 - 소수 만들기

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때

programmers.co.kr


에라토스테네스의 체를 만들고, 순열을 통해 주어진 숫자중 3개를 뽑아 그 세 수의 합이 소수인지 파악하면 된다.

 

#include <vector>
#include <algorithm>

#define LEN 50001
using namespace std;

bool seive[LEN];

void set_seive () {
    fill(seive, seive + LEN, true);
    seive[0] = seive[1] = false;
    
    for(int i = 2; i < LEN; i++) {
        if (seive[i]) {
            for (int j = 2; i * j < LEN; j++) seive[i * j] = false;
        }
    }
}

int solution(vector<int> nums) {
    int answer = 0;
    int is_prime;
    vector<bool> comb(nums.size());
    
    comb[0] = comb[1] = comb[2] = true;
    set_seive();
    do {
        is_prime = 0;
        for (int i = 0; i < comb.size(); ++i) {
            if (comb[i]) is_prime += nums[i];
        }
        if (seive[is_prime]) answer++;
    } while (prev_permutation(comb.begin(), comb.end()));
    
    return answer;
}