문제
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
출력
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
예제
입력 | 출력 |
3 16 | 3 5 7 11 13 |
알고리즘
제곱근 반복문으로만 풀어서는 시간 초과로 해결하지 못하고
꼭 에라토스테네스의 체 알고리즘을 사용해야 시간 내에 해결할 수 있다.
코드
import java.util.*;
public class Main {
public static boolean[] sifter;
public static void Prime(int n) {
sifter = new boolean[n + 1]; // 기본값 false
sifter[0] = sifter[1] = true;
for (int i = 2; i <= Math.sqrt(n); i++) { // 소수 아니면 true로 표시 -> 소수면 false
if (sifter[i] == true) continue;
for (int j = i * i; j < sifter.length; j += i) {
sifter[j] = true;
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int M = in.nextInt();
int N = in.nextInt();
Prime(N);
for (int i = M; i <= N; i++) {
if (sifter[i] == false) System.out.println(i);
}
}
}
자연수 N 크기만큼의 boolean 배열을 만들어 준다. 이때 boolean 배열의 초기값으로는 false이라 전체가 다 false가 되어있지만 후에 소수가 아닌 숫자들을 처리할 때 true로 만들어 주어 소수가 아니면 true, 소수이면 false가 되도록 boolean 배열을 수정한다.
그리고 boolean 배열이 다 만들어지면 해당 숫자가 소수인 지 소수가 아닌 지 boolean 배열의 index로 해당 숫자를 넣었을 때 그 결과가 소수가 아니면 true, 소수이면 false로 나오게 된다. 이 문제 같은 경우 소수이면 해당 숫자를 출력해야 하므로 조건을 if(sifter[i] == false) 이렇게 주었다.
'PS > 백준' 카테고리의 다른 글
[JAVA] 11653번 소인수분해 (0) | 2024.01.30 |
---|---|
[JAVA] 9020번 골드바흐의 추측 (2) | 2024.01.30 |
[JAVA] 2609번 최대공약수와 최소공배수 (0) | 2024.01.30 |
[JAVA] 4948번 베르트랑 공준 (2) | 2024.01.30 |
[JAVA] 1978번 소수 찾기 (2) | 2024.01.30 |