에라토스테네스의 체 - 소수 빠르게 알아내기

1~N 사이의 숫자중 소수를 구하는 문제가 있습니다.
이때

let num = [];
let N = 100;
for(let i =1; i<=N;i++){
	if(N%i !== 0) num.push(i);
}

아래의 방법을 통해 O(N)으로 구할 수 있습니다.

하지만 N이 커지면 커질수록 시간이 오래걸립니다.
그렇기 때문에 에라토스테네스의 체 방법으로 소수를 구하면 빠릅니다.

이 방법의 핵심은 n의 배수는 무조건 소수가 될 수 없다!

let N = 100;
let arr = [];
for(let i = 0;i<=N;i++){
	arr.push(i); //arr = [0,1,2,...,100]
}
arr[1] = 0; //1은 소수가 아니기 때문에
for(let i = 2; i<= N; i++){
	if(arr[i] === 0)continue;
    for(let j = i*2; j <= N ; j += i){
    	arr[j] = 0;
    }
}
arr.filter( x => x); //=> 소수만 남아있다.

'코테 준비 > 알고리즘' 카테고리의 다른 글

자료 구조 진짜 진짜 진짜 정리  (0) 2024.08.07
전체 탐색 - 조합 전체 탐색 (비트 연산 이용)  (0) 2024.08.05
숫자의 표현 문제  (0) 2024.08.05
약수 구하기  (0) 2024.08.05
나머지 연산의 특징  (0) 2024.08.05