에라토스테네스의 체란? (feat.cpp 구현)
알고리즘2020. 10. 28. 16:14
목차
소수 란?
1과 자기 자신을 제외한 나누어지는 수가 없는 수를 말합니다.
그렇게 되면 2를 제외한 모든 짝수는 소수가 될 수 없습니다.
(짝수들은 2로 나누어 떨어지기 때문입니다.)
bool check_the_prime_number(int num){
// 1, 2를 제외한 모든 짝수는 소수가 아니다.(false 반환)
if(num == 2) return true;
if(num == 1) return false;
if(num % 2 == 2) return false;
// n-1의 수까지 나누어 보고 나누어 떨어질시 소수 아님 판정(false)
for(int i = 3; i < num; ++i){
if(num % i == 0) return false;
}
return true;
}
에라토스테네스의 체
위의 방식에서 효율적으로 소수를 찾는 방법이 에라토스테네스 체의 방법입니다.
n이라는 숫자 안에 소수가 무엇이 존재하는지 알고 싶은 경우
2... n까지의 숫자를 종이에 적은 후 자기 자신을 제외한 배수들을 하나씩 지웁니다.
1. 2를 제외한 2의 배수들을 지워줍니다.
2. 다음 수중 지워지지 않은 수(3)의 배수들을 지워줍니다.
1, 2의 과정을 n번째까지 진행합니다.
결과적으로 남은 수들은 소수가 됩니다.
#include<vector>
#include<cmath>
using namespace std;
vector<bool> solution(int n){
// n + 1만큼의 bool 배열 (소수인지 아닌지 체크용)
// false : 소수 / true : 소수가 아님
vector<bool> checked(n + 1, false);
checked[0] = true;
checked[1] = true;
for(int i = 2; i < sqrt(n); ++i){
if(!checked[i]){
// 소수가 아닐경우
// i의 배수인 수들을 지워준다(true)
for(int j = i * 2; j < n; j+=i){
checked[j] = true;
}
}
}
return checked;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 위장 (0) | 2020.11.02 |
---|---|
[heap] 힙 이란? (feat.cpp) (0) | 2020.11.01 |
[프로그래머스] 가장 큰 수 (0) | 2020.10.30 |
[프로그래머스] 괄호 변환 (0) | 2020.10.29 |
[프로그래머스] 소수 찾기 (0) | 2020.10.28 |