개발

[프로그래머스] 소수 찾기

yun000 2024. 11. 19. 12:08

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42839

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

풀이

CHECK PRIME///////////////////////////////////////////////

소수들을 에라스토테네스의 체로 확인하자

원리는 간단하다. 소수들의 배수들은 소수가 아니라고 저장하는 것이다.

 

2부터 시작하자.

2 -> 소수이다.

2의 배수 4,6,8,10,12,14,.....들은 소수가 아닐 것이다

3 -> 3은 소수이다

3의 배수 6,9,12,15,18....들은 소수가 아닐 것이다

4 -> 

4는 이미 2의 배수라서 notPrime[4]=1로 저장되어 있으므로 그냥 넘어간다

5 -> 5는 소수이다

notPrime[5]=0이기 때문이다

5의 배수 10,15,20,25,30...들은 소수가 아닐 것이다.

 

....이를 반복하면 된다.

 

 

CHECK NUMBERS//////////////////////////////////////////

next_permutation을 사용하면 문자열 혹은 vector등의 모든 조합을 확인할 수 있다.

모든 조합들의 부분들을 확인하며

notPrime에 저장된 소수인지 아닌지에 대한 여부에 따라 

unordered_set<int>primes에 넣어주면 된다.

(중복이 있으면 안되니 set에 넣어준다)

 

마지막에 set의 size를 반환하면 끝

 

코드

#include <string>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <unordered_set>
#include <vector>
using namespace std;


int solution(string numbers) 
{
    unordered_set<int>primes;
    sort(numbers.begin(),numbers.end());
    
    //CHECK PRIME/////////////////////////////////
    vector<int>notPrime(10000000,0);
    notPrime[0]=1; notPrime[1]=1;
    for(int i=2;i<notPrime.size();i++)
    {
        if(notPrime[i]==1)continue;
        for(int k=i+i;k< notPrime.size();k+=i)
        {notPrime[k]=1;}
    }
    
    //CHECK NUMBERS///////////////////////////////
    do
    {
        string s="";
        for(int i=0;i<numbers.size();i++)
        {
            s+=numbers[i];
            if(!notPrime[stoi(s)]){primes.insert(stoi(s));}
        }
    }while(next_permutation(numbers.begin(),numbers.end()));
        
    return primes.size();
}