본문으로 바로가기

에라토스테네스의 체(Sieve of Eratosthenes)

category JavaScript 2025. 3. 17. 10:14
 

프로그래머스

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

programmers.co.kr

문제 설명

1부터 n 사이에 있는 소수의 개수를 반환하는 함수를 작성해야 한다. 소수란 1과 자기 자신으로만 나누어지는 수를 의미하며, 1은 소수가 아니다.

처음 시도한 코드 (시간 초과)

function solution(n) {
    let answer = 0;
    for (let i = 2; i <= n; i++) {
        let flag = true;
        for (let j = 2; j <= Math.sqrt(i); j++) {
            if (i % j === 0) {
                flag = false;
                break;
            }
        }
        if (flag) {
            answer++;
        }
    }
    return answer;
}

이 코드는 O(n√n)의 시간 복잡도를 가집니다.

  • i2부터 n까지 반복 (n번)
  • j2부터 √i까지 반복 (√n번)

에라토스테네스의 체

에라토스테네스의 체 개념

  • 2부터 n까지 모든 수를 소수라고 가정하고 배열을 만듭니다.
  • 2부터 시작해서 해당 수의 배수를 모두 제거합니다. 
  • 남아있는 수 중에서 가장 작은 소수를 찾아 그 배수를 제거합니다. 
  • 이를 √n까지 반복하면 남아있는 수가 소수입니다.
function solution(n) {
    let primes = new Array(n + 1).fill(true);
    primes[0] = false;
    primes[1] = false; 

    for (let i = 2; i <= Math.sqrt(n); i++) {
        if (primes[i]) { // i가 소수라면
            for (let j = i * i; j <= n; j += i) {
                primes[j] = false; // i의 배수를 모두 제거
            }
        }
    }

    return primes.filter(v => v).length; // 남아있는 소수 개수 반환
}

에라토스테네스의 체 알고리즘의 시간 복잡도는 O(n * log(log n))의 시간 복잡도를 가집니다.

 

 

알고달레

알고리즘 입문자를 위한 달레의 친절한 안내서

www.algodale.com