코딩 테스트 문제를 푸는 중 소수를 구해야 하는 상황이 종종 있어서 소수를 구하는 방법을 정리하고자 한다.
에라토스테네스의 체
에라토스테네스의 체는 소수를 구하는 대표적인 방법이다.
해당 방법은 수학자 에라토스테네스가 발견한 것으로 동작 과정은 아래와 같다.
에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 에라토스테네스의 체 수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수
ko.wikipedia.org
위 그림을 보면 쉽게 이해할 수 있는데 2부터 시작해 N까지 배수를 지워나가는 형식이다.
여기서 중요한 점은 배수를 지우는 작업을 2 ~ 10까지만 진행하고 11부터는 모두 소수 처리를 했다는 것인데,
그 이유는 √N = √120 < 11이기 때문이다.
11부터 계산하지 않는 이유는
11의 배수를 파악하기 위해선 11 * 2, 11 * 3, ..., 11 * 10까지 11에 2 ~ 10을 곱해야 하는데
이는 모두 2 ~ 10의 배수이기 때문이다.
구현
내용이 어렵지 않으므로 바로 구현해 보았다.
인스턴스 변수 & 생성자
최댓값 n을 받으면 배열을 초기화하고 메서드를 불러온다.
int[] prime;
Eratosthenes(int n) {
prime = new int[n + 1];
for(int i = 0; i <= n; i++)
prime[i] = i;
primeCheck();
print();
}
primeCheck() & print() 메서드
void primeCheck() {
for(int i = 2; i <= Math.sqrt(prime.length - 1); i++) {
if(prime[i] != 0)
for(int j = i + i; j <= prime.length - 1; j += i)
prime[j] = 0;
}
}
void print() {
System.out.print("소수: ");
for(int i = 2; i < prime.length; i++)
if(prime[i] != 0)
System.out.print(prime[i] + " ");
}
√n까지만 돌면서 만약 지우지 않은 값이면 해당 값의 배수를 지운다.
print()에선 0, 1을 제외해야 하므로 int i = 2부터 시작한다.
아래는 결과이다.
전체 코드
package practice;
public class IsPrime {
public static void main(String[] args) {
new Eratosthenes(200);
}
}
class Eratosthenes {
int[] prime;
Eratosthenes(int n) {
prime = new int[n + 1];
for(int i = 0; i <= n; i++)
prime[i] = i;
primeCheck();
print();
}
void primeCheck() {
for(int i = 2; i <= Math.sqrt(prime.length - 1); i++) {
if(prime[i] != 0)
for(int j = i + i; j <= prime.length - 1; j += i)
prime[j] = 0;
}
}
void print() {
System.out.print("소수: ");
for(int i = 2; i < prime.length; i++)
if(prime[i] != 0)
System.out.print(prime[i] + " ");
}
}
아래는 에라토스테네스의 체를 이용할 수 있는 문제이다.
https://school.programmers.co.kr/learn/courses/30/lessons/12921
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
에라토스테네스의 체는 일반적으로 시간복잡도 O(n log (log n))를 가진다.
'Algorithm & PS > Algorithm' 카테고리의 다른 글
알고리듬 - 순위 매기기 (0) | 2023.09.16 |
---|---|
알고리듬 - 최대 공약수 & 최소 공배수 구하기(유클리드 호제법) (0) | 2023.08.30 |
알고리듬 - 깊이 우선 탐색, 너비 우선 탐색 (0) | 2023.08.28 |
알고리듬 - 합병, 퀵, 기수 정렬 (1) | 2023.08.25 |
알고리듬 - 버블, 선택, 삽입 정렬 (0) | 2023.06.27 |