알고리즘/백준

백준_4948 - JAVA

맏리믓 2022. 12. 30. 13:00


- 알고리즘

. 구해야 하는 범위의 최대값은 123456 ~ 246913 이다.(2 * n)

. 1부터 246913 까지의 모든 수에 대해서 소수인지 아닌지를 기록한 boolean 배열을 이용하여 구한다.

 

. 제곱수는 어짜피 소수가 아니기 때문에 2부터 2*n의 제곱근 까지 반복을 돌아 주며 소수 배열을 구한다.

. 현재 i의 제곱 부터 i씩 증가 되는 수는 소수가 아니기 때문에 true 를 넣어 주는 식으로 소수를 배열을 구할 수 있다.

	public static void Get_Prime(){
		PRIME[0] = PRIME[1] = true;

		for (int i=2; i<=Math.sqrt(PRIME.length); i++){
			if(PRIME[i]){
				continue;
			}
			for (int j=i*i; j<PRIME.length; j+=i){
				PRIME[j] = true;
			}
		}
	}

 

. 이렇게 소수 배열을 구하고 나면 main 에서 n ~ 2*n 사이의 수를 모두 배열과 대조 해 보면서 소수인 수를 count 해 주는 식으로 쉽게 구할 수 있다.


- 코드

import java.awt.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class B_4948 {

	public static boolean[] PRIME = new boolean[246913];

	public static void Get_Prime(){
		PRIME[0] = PRIME[1] = true;

		for (int i=2; i<=Math.sqrt(PRIME.length); i++){
			if(PRIME[i]){
				continue;
			}
			for (int j=i*i; j<PRIME.length; j+=i){
				PRIME[j] = true;
			}
		}
	}
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		Get_Prime();

		while(true){
			int N = Integer.parseInt(br.readLine());
			if(N == 0){
				break;
			} else if(N == 1){
				bw.write("1" + "\n");
			} else {
				int Cnt = 0;
				for (int i=N+1; i<2*N; i++){
					if(!PRIME[i]){
						Cnt += 1;
					}
				}
				bw.write(Cnt + "\n");
			}
		}


		bw.flush();
		bw.close();
	}
}