본문 바로가기
Study/[Algorithm]

[백준] 1929번 - 소수 구하기

by Nameless 2021. 5. 28.

 

 

 

만만하게 봤다가 좌절한 문제...

에라토스어쩌구 체를 써야한다네ㅠ? 정답률 27%인 이유가 있었다...

 

 


 

얼핏 보면 쉬워 보이지만 에라토스테네스의 체를 이용하는 방법이다.

 

[바로가기]

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간

ko.wikipedia.org

 

에라토스테네스의 체 란?

 

  1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. (그림 -회색 사각형)
  2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
  3. 자기 자신을 제외한 2의 배수를 모두 지운다.
  4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
  5. 자기 자신을 제외한 3의 배수를 모두 지운다.
  6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
  7. 자기 자신을 제외한 5의 배수를 모두 지운다.
  8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
  9. 자기 자신을 제외한 7의 배수를 모두 지운다.
  10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.

알고리즘

 

1. 소수인지 판별하는 primeList 생성 크기는 N+1

그 중 0과 1은 소수가 아니므로 true

 

boolean[] primeList = new boolean[N+1];
primeList[0]=primeList[1]=true; //0,1은 소수 X

 

2. 2~N까지 반복한다.

반복문 i가 소수가 아니라면(true) 계속 진행한다.

 

for(int i=2; i<=N; i++) {
	if(primeList[i]==true) {
    	continue;
    }

 

3. i의 배수일때 = 약수에 i가 포함된다 = 소수 X 

ex) 4의 배수인 16의 약수에 4가 포함되기 때문에 소수가 아니다.

 

※  j=j+1인 이유는 해당 숫자만큼 더해주어야하기 때문이다.

ex) 2, 4, 6, 8, 10이면 2씩 더해줌

for(int j=i*2; j<=N; j=j+i) {
	primeList[j]=true;
}

 

false인 값만 출력해주면 된다.

 

 

최종코드 

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[] primeList = new boolean[N+1];
		primeList[0]=primeList[1]=true;
		
        for(int i=2; i<=N; i++) {
			if(primeList[i]==true) {
				continue;
			}

			for(int j=i*2; j<=N; j=j+i) {
				primeList[j]=true;
			}
		}		
		for(int i=M; i<=N; i++) {
			if(primeList[i]==false) {
				System.out.println(i);
			}
		}
	}
}

 

댓글