코딩테스트/프로그래머스

[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개씩 더한 다음에 알아내는 방법도 있는데
효율성이 안좋을 거 같아 나눠서 계산했다.