여러분, 혹시 소수(prime number)라는 개념을 들어보신 적 있으신가요? 소수는 수학적 개념 중에서도 꽤 흥미로운 주제인데요. 오늘은 이 소수를 빠르게 찾아내는 방법 중 하나인 '에라토스테네스의 체(Sieve of Eratosthenes)'에 대해 이야기해 볼까 합니다. 그럼 문제를 통해 이 개념을 어떻게 적용할 수 있는지 자세히 알아보도록 할게요.
오늘 다룰 문제는 "1부터 n까지의 숫자 중에서 소수의 개수를 반환하라"는 것입니다.
소수는 1과 자기 자신 외에는 나누어 떨어지지 않는 수를 의미합니다. 예를 들어, 2, 3, 5, 7 등이 소수에 해당합니다. 반면에 10는 1, 2, 5, 10으로 나누어지기 때문에 소수가 아닙니다.
이 문제를 해결하기 위해 사용할 방법은 '에라토스테네스의 체'라는 알고리즘입니다. 이 단어가 좀 어렵게 느껴지시겠지만, 실제로는 그리 복잡하지 않습니다.
에라토스테네스의 체는 소수를 찾는 가장 효율적인 방법 중 하나입니다. 이 방법의 아이디어는 다음과 같습니다:
이제 이 방법을 사용해 실제로 문제를 해결해보겠습니다!
먼저 에라토스테네스의 체 알고리즘을 코드로 어떻게 구현할 수 있는지 살펴보겠습니다.
// 전체 범위의 숫자를 소수인지 판별할 수 있는 배열로 초기화합니다.
function findPrimeCount(n) {
// 각 숫자가 소수인지 여부를 나타내는 배열을 초기화 (true: 소수, false: 소수가 아님)
let isPrime = new Array(n + 1).fill(true);
// 소수가 아닌 숫자를 제외할 때 사용될 카운터 변수 초기화
let count = 0;
// 2부터 n까지의 숫자에 대해 소수 여부를 판별합니다.
for (let i = 2; i <= n; i++) {
if (isPrime[i]) {
count += 1; // 현재 숫자가 소수임을 확인했으므로 카운트 증가
// 현재 소수의 배수들은 소수가 아니므로 false로 설정합니다.
for (let j = 2 * i; j <= n; j += i) {
isPrime[j] = false;
}
}
}
// 소수의 개수를 반환합니다.
return count;
}
이 코드는 다음과 같은 단계로 동작합니다.
먼저 isPrime
이라는 배열을 초기화합니다. 이 배열의 인덱스는 각 숫자에 대응하고, 배열의 값은 해당 숫자가 소수인지 여부를 나타냅니다. 초기에는 모든 값을 true
로 설정하여 모든 숫자가 소수라고 가정합니다.
2부터 시작하여 각 숫자에 대해 소수인지 확인합니다. 만약 현재 숫자가 소수라면, 해당 숫자의 배수들은 모두 소수가 아니므로 false로 설정합니다.
이 과정을 n까지 반복하며 소수의 개수를 찾아냅니다.
여기까지가 기본적인 에라토스테네스의 체를 이용한 소수 찾기 알고리즘의 구현입니다. 이 경우 시간 복잡도는 O(n log log n)이라는 점에서 매우 효율적입니다.
이번 포스트에서는 소수 찾기 문제를 해결하기 위해 에라토스테네스의 체라는 알고리즘을 사용해봤습니다. 이 방법은 매우 효율적이며, 많은 범위의 숫자에서 소수를 찾아야 하는 문제에서 특히 유용합니다. 여러분도 직접 이 코드로 실습해보시고, 소수의 매력을 발견해보세요!
궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 계속해서 재미있는 알고리즘 이야기를 준비해 오겠습니다. 감사합니다!