728x90
반응형
SMALL
📌 문제 정보
- 출처: 문제 링크
- 난이도: ⭐
- 문제 유형: 수학
- 사용 언어: Java
🔍 문제 설명
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
💡 풀이 노트
💡 에라토스테네스의 체란?
고대 그리스의 수학자 에라토스테네스가 만든 방법으로, 소수를 빠르게 찾는 알고리즘
2부터 시작해 배수들을 지워나가며 소수만 남기는 방식.
시간 복잡도는 O($nloglogn$)으로 빠른 편
boolean[] num = new boolean[N+1];
Arrays.fill(num,true);
- 인덱스를 수로 사용하여, 소수인지 여부를 저장하는 배열
- 처음에는 모두 소수라고 가정( `true`)
num[0] = false;
num[1] = false;
- `num[0]` ,`num[1]` 은소수가 아니므로 `false` 처리
for(int i =2 ;i <= Math.sqrt(N); i++){
if(num[i]){
for(int j = i*i ; j <= N ; j += i)
num[j] = false;
}
}
- `i`의 배수들을 지워나가며 소수가 아닌 것들을 제거
🚀 코드 (Java)
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
boolean[] num = new boolean[N+1];
Arrays.fill(num,true);
num[0] = false;
num[1] = false;
for(int i =2 ;i <= Math.sqrt(N); i++){
if(num[i]){
for(int j = i*i ; j <= N ; j += i)
num[j] = false;
}
}
for(int i = M ;i <= N ;i++){
if(num[i]){
System.out.println(i);
}
}
}
}
🖥 실행 결과
입력
3 16
출력
3
5
7
11
13
🔄 에라토스테네스의 체 추가 설명
아이디어 요약:
- 2부터 시작해서, 그 수의 배수들을 모두 지워나간다.
- 지워지지 않고 남은 수는 모두 소수!
예시 (2~26 사이 소수 찾기):
[초기단계] 2부터 26까지의 모든 자연수를 나열 (N = 26)

[Step 1] 아직 처리하지 않은 가장 작은 수 2를 제외한 2의 배수는 모두 제거

[Step 2] 아직 처리하지 않은 가장 작은 수 3를 제외한 3의 배수는 모두 제거

[Step 3] 아직 처리하지 않은 가장 작은 수 5를 제외한 5의 배수는 모두 제거

[Step 4] 마찬가의 과정을 반복했을 때 최종적인 결과는 다음과 같다

N을 26이라고 설정했다면 제곱근 값은5.xx값이기에 5까지만 확인하면 성공적으로 알고리즘 수행!!
📌 깃허브 코드 저장소: https://github.com/glorypang/CodingTest
728x90
반응형
LIST