1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
풀이 과정
-에라토스테네스의 체 이용
에타토스테네스의 체
[알고리즘] 에라토스테네스의 체 알고리즘(C언어) (tistory.com)
[알고리즘] 에라토스테네스의 체 알고리즘(C언어)
'에라토스테네스의 체' 란? '에라토스테네스의 체'란, 2부터 시작하는 양의 정수들 중에서 소수(prime number)인 것을 찾아내는 알고리즘 중 하나입니다. 이 알고리즘은 2부터 시작하여, 그 다음 소수
bakjoon-coding.tistory.com
- 2부터 시작하는 양의 정수들 중에서 소수(prime number)인 것을 찾아내는 알고리즘 중 하나
- 2부터 시작하여, 그 다음 소수의 배수를 모두 지워나가면서 소수를 찾아내는 방식으로 동작
- 먼저 2부터 n까지의 모든 정수를 배열에 저장
- 배열에서 2를 제외한 2의 배수를 모두 지움
- 다음으로, 배열에서 3을 제외한 3의 배수를 모두 지움
- 이렇게 배열에서 지워지지 않은 가장 작은 수를 다음 소수로 간주하고, 그 수를 제외한 그 수의 배수를 모두 지움
- 이 과정을 반복하여, 배열에서 지워지지 않은 수가 소수가 됨
정답
import java.util.Scanner;
public class Main {
public static void Eratosthenes(int arr[], int n)
{
//배열 초기화
//2부터 n까지의 정수를 배열에 저장
for(int i=2; i<=n; i++)
{
arr[i] = i;
}
//에라토스테네스의 채 알고리즘
//2부터 시작하여 2의 배수를 모두 지움, 3부터 시작하여 3의 배수를 모두 지움
//... 위 과정 반복
for(int i=2; i*i<=n; i++)
{
//배열의 값이 0인 경우는 이미 지워진 수 -> 무시하고 다음 인덱스로
if(arr[i] ==0) continue;
for(int j=i*2; j<=n; j+=i)
{
arr[j] = 0;
}
}
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
if(m<2)
{
m=2;
}
int arr[] = new int[n+1];
Eratosthenes(arr,n);
for(int i=m; i<=n; i++)
{
if(arr[i]!=0)
{
System.out.println(arr[i]);
}
}
}
}
'Java > 백준' 카테고리의 다른 글
[JAVA] 백준 17103 골드바흐 파티션 (0) | 2024.02.10 |
---|---|
[JAVA] 백준 4948 베르트랑 공준 (1) | 2024.02.10 |
[JAVA] 백준 4134 다음 소수 (1) | 2024.02.10 |
[JAVA] 백준 2485 가로수 (1) | 2024.02.10 |
[JAVA] 백준 1735 분수합 (1) | 2024.02.10 |