study/JAVA
03. 에라토스테네스의 체
김팥빵_
2023. 9. 9. 16:56
응용 백준 문제 : 1929
에라토스테네스의 체는 소수를 찾는 방법이다.
방법 : 2부터 시작해 소수들의 배의 수를 자신을 제외하고 제거해 나가며 소수를 찾는다.
@ 찾으려는 최대 구간과 크거나 가장 가까운 제곱수 의 자연수까지의 소수만 search하면 된다.
예를 들어, 1-120 구간 내의 소수를 찾는다고 하면 11의 제곱수는 121이므로
에라토스테네스의 체를 이용하면 2부터 11까지의 소수를 찾아 계산하면 된다.
아래는 백준 1929를 에라토스테네스의 체를 이용해 푼 코드
import java.util.Scanner;
public class Main {
static boolean [] array; //아무것도 넣지 않았을 때 모든 default는 false다
static int M, N;
public static void judgePrime()
{
//true : 소수 아님, false : 소수 맞음
array[0] = true;
array[1] = true;
for (int i=2;i<=Math.sqrt(N);i++)
{
if (array[i] == true) continue; //소수가 아니면 배수계산을 넘어간다.
for (int j=(i*2);j<=N;j+=i)
{
array[j] = true;
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
M = scanner.nextInt();
N = scanner.nextInt();
scanner.nextLine();
array = new boolean[N+1];
judgePrime();
for (int i=M;i<=N;i++) {
if (array[i] == false) System.out.println(i);
}
}
}
+) 출력 성능이 좋지 않아
String Builder를 사용했다.
아래는 수정해서 stringBuilder를 사용한 코드
import java.util.Scanner;
public class Main {
static boolean [] array; //아무것도 넣지 않았을 때 모든 default는 false다
static int M, N;
public static void judgePrime()
{
//true : 소수 아님, false : 소수 맞음
array[0] = true;
array[1] = true;
for (int i=2;i<=Math.sqrt(N);i++)
{
if (array[i] == true) continue; //소수가 아니면 배수계산을 넘어간다.
for (int j=(i*2);j<=N;j+=i)
{
array[j] = true;
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
M = scanner.nextInt();
N = scanner.nextInt();
scanner.nextLine();
array = new boolean[N+1];
judgePrime();
//StringBuilder 사용
StringBuilder stringbuilder = new StringBuilder();
for (int i=M;i<=N;i++) {
if (!array[i]) stringbuilder.append(i).append('\n');
}
System.out.println(stringbuilder);
}
}