코딩테스트

[BOJ_1929/JAVA] 소수 구하기

Eun 2021. 12. 29. 17:07

https://www.acmicpc.net/problem/1929

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

문제

 

풀이

문제를 풀고 너무 쉽게 풀어서 정답률이 26%인게 안믿겼다..

근데 역시나 시간초과 오류가 뜨면서 다들 시간초과때문에 틀렸구나.. 라는 생각이 들었다.

그래~ 내가 남들이 못푸는걸 금방 풀 수 있을리가 없지~

해당 문제는 '에라토스테네스의 체'라는 알고리즘을 사용하여 풀었다.

 

에라토스테스스의 체란?

소수를 판별하는 알고리즘이다. 

조금 더 자세한 설명은 여기를 참고하길 바란다.

 

for문을 돌면서 제곱에 해당하는 수를 전부 true로 바꿔주어 최종적으로 false인 값만 출력하도록 하였다.

for문을 돌 때 `Math.sqrt()`하는 함수를 사용하는데, 이것은 루트값을 구해주는 함수이다.

 

코드

package Week05;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BOJ1929 {
	
	static boolean [] flag;

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		String input = br.readLine();
		
		String [] nums = input.split(" ");
		
		int a = Integer.parseInt(nums[0]);
		int b = Integer.parseInt(nums[1]);
		
		flag = new boolean[b+1];
		
		get_prime();
		
		for(int i=a;i<=b;i++) {
			if(!flag[i]) {
				sb.append(i+"\n");
			}
		}
		
		System.out.println(sb);

	}
	
	static void get_prime() {
		
		//false=소수, true=소수아님.
		flag[0]=flag[1]=true;
		
		for(int i=2;i<Math.sqrt(flag.length);i++) {
			if(flag[i]) {
				continue;
			}
			for(int j=i*i;j<flag.length;j+=i) {
				flag[j]=true;
			}
		}
		
	}

}