https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
- 문제
- 문제 풀이
백준 1929번 소수 구하기는 실버 3 난이도의 수학 및 에라토스테네스의 체 문제이다. 이 문제에서는 입력으로 자연수 M과 N이 주어진다. 그리고 M 이상 N 이하의 소수들을 모두 출력해주면 되는 문제이다.
이 문제에서는 에라토스테네스의 체 알고리즘을 이용해서 풀 것이다. 에라토스테네스의 체를 잘 모르면 밑에 있는 글을 참고하면 되겠다.
https://propercoding.tistory.com/182
[알고리즘] 에라토스테네스의 체 (Sieve of Eratosthenes)
목차 에라토스테네스의 체란? 에라토스테네스의 체는 소수 판별 알고리즘이다. 소수란 ‘양의 약수를 두 개만 가지는 자연수’를 뜻한다. 즉, 1과 자기 자신만 약수로 가진다. 소수의 예시로는 2
propercoding.tistory.com
우선 에라토스테네스의 체 원리처럼 크기가 n인 배열을 선언하고 m부터 n까지만 초기화해준다. 그리고 2부터 시작해서 n까지 for-loop을 돌리고 이 자연수들의 배수들을 모두 배열에서 지워준다. 이때 지워주는 것은 단순히 배열 값을 0으로 바꿔주면 된다.
이러면 배열에는 자연수들의 배수를 모두 지웠으니 소수만 남게 된다. 이제 이 소수들을 StringBuilder를 이용해서 마지막에 한꺼번에 출력만 해주면 된다.
자세한 코드는 밑에 있는 코드를 참고하면 되겠다.
- 코드
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());
primeNumber(m, n);
}
//에라토스테네스의 체 이용
static void primeNumber(int m, int n) {
int[] arr = new int[n+1];
StringBuilder sb = new StringBuilder();
//배열 초기화
for (int i = 2; i <= n; i++) {
arr[i] = i;
}
//2부터 시작해서 i의 배수들을 배열에서 지워준다
for (int i = 2; i <= n; i++) {
//이미 지워진 수는 건너뛴다
if (arr[i] == 0) continue;
for (int j = i+i; j <= n; j += i) {
arr[j] = 0;
}
}
for (int i = m; i <= n; i++) {
if (arr[i] != 0) sb.append(i + "\n");
}
System.out.print(sb);
}
}
'백준' 카테고리의 다른 글
[백준] 15965번 : K번째 소수 – JAVA [자바] (0) | 2022.07.15 |
---|---|
[백준] 1978번 : 소수 찾기 – JAVA [자바] (0) | 2022.07.15 |
[백준] 1193번 : 분수찾기 – JAVA [자바] (0) | 2022.07.13 |
[백준] 1085번 : 직사각형에서 탈출 – JAVA [자바] (0) | 2022.07.12 |
[백준] 2231번 : 분해합 – JAVA [자바] (0) | 2022.07.12 |
댓글