[백준]_4948_베르트랑공준

4998.png

의 문제를 풀기 위해 에라토스테네스의 체의 원리를 이용했다. 에라토스테네스의 체는 소수를 구하기 위한 알고리즘 중 가장 성능이 좋은 방법으로, 소수의 배수를 거름으로써 건너뛰는 작업이 많아진다.

과정

  1. 선언

    • 2*n 의 최대값이 246912이므로 246913의 소수 여부 배열(boolean)
    • 위와 같은 크기의 int배열 선언하여 1부터 소수가 몇 개 있는지 저장
  2. 값 할당

    • 에라토스테네스 체 원리 이용하여 소수 여부를 true로 바꿈
    • 2부터 반복문을 이용해 false가 나올 때마다 count를 올려주는 식으로 코드를 구성
  3. 최종 풀이

    • 수를 입력받아 2*n까지의 소수 개수에서 n개까지 소수 개수를 빼고 정답 출력

전체 코드는 다음과 같다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.Scanner;

public class Test {
		
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in); 
		
		boolean[] check = new boolean[246913];
		int[] arr = new int[246913]; 
		check[0] = check[1] = true; 
		
		for(int i=2; i<=Math.sqrt(246913);i++) {
			if(check[i]==true) continue; 
			for(int j=i*i; j<=246913; j=j+i) check[j]=true; 
		} 
		
		int count =0;
		for(int i=2;i<246913;i++) {
			if(!check[i]) count++;
			arr[i] = count;
		}
		
		int n = 1;
		while(true) {
			n = sc.nextInt();
			if (n==0) break;
			System.out.println(arr[2*n] - arr[n]);	
		}
	}
}
updatedupdated2021-03-012021-03-01
Load Comments?