코딩테스트/프로그래머스
[Level 2][C++] 소수 만들기
MJ.Lee
2024. 10. 1. 12:46
#include <vector>
#include <iostream>
using namespace std;
int solution(vector<int> nums) {
vector<int> odds;
vector<int> evensOne;
vector<int> evensTwo; //짝짝 집어넣는 곳
vector<int> addThree; //짝짝홀, 홀홀홀 더한 애들을 집어 넣는 곳.
//홀수 짝수 분류
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] % 2 == 0)
evensOne.push_back(nums[i]);
else
odds.push_back(nums[i]);
}
//짝수는 처음부터 배제시킨다. 짝수+짝수+홀수, 홀수+홀수+홀수 조합만이 있다.
//홀수가 없으면 소수가 존재하지 않는다.
if (odds.empty())
return 0;
//짝+짝+홀수 조합.
if (evensOne.size() > 1)
{
for (int i = 0; i < evensOne.size() - 1; i++)
for (int j = i + 1; j < evensOne.size(); j++)
evensTwo.push_back(evensOne[i] + evensOne[j]);
for (int i = 0; i < odds.size(); i++)
for (int j=0; j<evensTwo.size(); j++)
addThree.push_back(odds[i] + evensTwo[j]);
}
//홀+홀+홀 조합
if (odds.size() > 2)
{
for (int i = 0; i < odds.size()-2; i++)
for (int j = i + 1; j < odds.size()-1; j++)
for (int k = j + 1; k < odds.size(); k++)
addThree.push_back(odds[i] + odds[j] + odds[k]);
}
int answer = 0;
for (int j=0; j<addThree.size(); j++)
{
for (int i = 2; i <= addThree[j]; i++)
{
if (i == addThree[j])
answer++;
if (addThree[j]%i == 0)
break;
}
}
return answer;
}
짝수 홀수 안나누고, 그냥 반복문 3개 겹쳐서 전부 3개씩 더한 다음에 알아내는 방법도 있는데
효율성이 안좋을 거 같아 나눠서 계산했다.