다음 문제는 에라스토테네스의 체로 M이상 N이하의 자연수 중 소수인 것을 골라 소수의 합과 최솟값을 찾는 문제인데 이 문제를 풀기 위해서 다양한 방법이 있지만 이번에는 알고리즘을 통해 풀어보자.
우선 '에라토스테네스의 체'가 무엇인지 예를들어 알아보자, 2부터 N까지의 소수를 구한다고 하면,
import java.util.Scanner;
public class Num2581 {
public static boolean prime[]; // 소수를 체크할 배열
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int M = in.nextInt();
int N = in.nextInt();
prime = new boolean[N+1]; // 0~N 생성
get_prime();
// 소수가 아닌 index = true
// 소수인 index = false
// 소수의 합, 최소값
int sum = 0;
int min = Integer.MAX_VALUE;
for(int i = M; i<=N; i++) {
if(prime[i] == false) {
sum += i;
if(min == Integer.MAX_VALUE) {
min = i;
}
}
}
if(sum == 0) {
System.out.println(-1);
} else {
System.out.println(sum);
System.out.println(min);
}
}
// 에라토스테네스 체 알고리즘
private static void get_prime() {
prime[0] = true;
prime[1] = true;
// 제곱근 함수 : Math.sqrt()
for(int i = 2; i <= Math.sqrt(prime.length); i++) {
// i의 배수들을 걸러주기 위한 반복문
for(int j = i*i; j < prime.length; j+= i) {
prime[j] = true;
}
}
}
}
코드를 입력하세요
이중 for문이라 시간 복잡도가 O(n^2)인것 같지만 그렇지 않다.
에라스토테네스의 체 시간복잡도는 O(Nlog(logN))인데 과정이 너무 복잡하여 훗날에 다시 과정을 추가해 보겠다 ㅜ