컴퓨터 공학/백준
[백준] JAVA 자바 : 소수 구하기 (1929번)
kim-dev
2024. 1. 22. 20:38
반응형

저번 문제와 같이 이번 문제 역시 소수를 구하는 문제다.
이번에는 저번 문제에서 시도하지 못했던 에라토스테네스의 체를 이해해서 구현해 보았다… 개념이 막 어렵지는 않아서 나름 구현할 수 있었는 듯.
그런데 아무리 노력해도 180ms 이하로는 시간이 안 내려가던데… 1등 분이 120ms로 하셨던데 소스가 비공개되어 있어서 아쉽다 보고싶은데… ㅋㅋㅋㅋ
아 그리고 지금까지는 다 split()으로 나눴는데… StringTokenizer이라는 클래스가 있었으니까 이제부터는 이걸 사용하도록 하자!!!
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class GetPrimeNumber_1929 {
// 소수인지 아닌지를 담을 배열
static boolean[] n_list; // true = 소수, false = 소수 아님
public static int stoi(String str) {
return Integer.parseInt(str);
}
public static void isPrime(int num, int N) {
if (num == 0 || num == 1) { // 0이나 1은 소수가 아님
n_list[num] = false;
} else { // 2 이상의 수에 대해서는
for (int i=2; num*i <= N; i++) { // 그 배수를 전부 합성수로 판단한다
n_list[num*i] = false;
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// split(" ") 말고 StringTokenizer이라는 클래스가 있었네...
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int M = stoi(st.nextToken());
int N = stoi(st.nextToken());
n_list = new boolean[N+1];
Arrays.fill(n_list, true);
n_list[0] = false;
n_list[1] = false;
for (int i=2; i<=Math.sqrt(N); i++) { // 2부터 루트N까지 돌면서
if (n_list[i] == false) continue; // 이미 합성수로 판단된 수는 제외하고
isPrime(i, N); // 그 수가 합성수인지 판단하고, 그렇다면 배수를 전부 합성수로 만든다
}
for (int i=M; i<=N; i++) {
if (n_list[i] == true) {
sb.append(i).append("\n");
}
}
System.out.print(sb);
br.close();
}
}
로그인
www.acmicpc.net
작성일자: 2023-09-09