smooth waters run deep

1d-1c/BOJ

1929_소수 구하기 (JAVA)

yeon_11 2020. 10. 20. 18:11
 

1929번: 소수 구하기

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

www.acmicpc.net

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int M = sc.nextInt();
		int N = sc.nextInt();

		boolean[] check = new boolean[N+1];
		for(int i=2; i<=N; i++){ //2의배수부터 체크해야되니까 2부터 N까지 true로
			check[i] = true;
		}

		for(int i=2; i<=N; i++){
			if(!check[i]) //이미 체크한거는 다시 체크X
				continue;
			for(int j=i+i; j<=N; j+=i){
				check[j] = false; //j를 제외한 j의 배수 체크하기
			}
		}

		for(int i=M; i<=N; i++){
			if(check[i])
				System.out.println(i);
		}
	}
}

 

이전에 소수구하는 문제를 모든수를 체크하는 방식으로 ㅎㅎ.. 효율성을 하나도 고려안한채 풀었는데

이 문제에서는 시간초과가 난다. 정신차리고 에라토스테네스의체 이용해서 풀었다ㅎ_ㅎ

 

 

소수

소수를 구하는 방법에는 세 가지가 있다. ① (2부터 자기자신-1) 까지의 모든 수로 나누어보기 소수의 정의 = 1과 자기자신으로 나누어떨어지는 수 를 이용하는 방법! 모든 수로 나누어 보는 과정�

yeone2ee.tistory.com

 

 

[문제 풀이 생각 과정]

 

1. M~N 의 수만 체크하면 되지만, 에라토스테네스의체를 이용하려면 2의배수부터 체크해야한다.

    그러므로 check[]배열은 2부터 N까지 true로 초기화해준다.

 

2. 2~N까지의 모든 수에 대하여

    2를 제외한 2의배수, ... N을 제외한 N의배수까지 각 배수를 false로 체크한다.

 

3. true인 수 == 소수!

    왜냐면 n의 배수로 체크가 되지 않았다는건, 1과 자기자신만을 약수로 갖는다는 의미이기 때문

'1d-1c > BOJ' 카테고리의 다른 글

9020_골드바흐의 추측 (JAVA)  (0) 2020.10.21
4948_베르트랑 공준 (JAVA)  (0) 2020.10.20
2581_소수 (JAVA)  (0) 2020.10.20
1978_소수 찾기 (JAVA)  (0) 2020.10.20
1011_Fly me to the Alpha Centauri (JAVA)  (0) 2020.10.20