본문 바로가기

문제 풀이/인프런

[JAVA11/알고리즘]2-5 소수찾기(에라토스테네스의 체)

문제

자연수 N이 입력되면 1부터 N까지의 소수의 개수를 출력하는 프로그램을 작성하세요.

만약 20이 입력되면 1부터 20까지의 소수는 2, 3, 5, 7, 11, 13, 17, 19로 총 8개입니다. 


입력

첫 줄에 자연수의 개수 N(2<=N<=200,000)이 주어집니다


출력 

첫 줄에 소수의 개수를 출력합니다.


예시 입력 1 

20


예시 출력 1

8


 



해결

소수 찾기 문제를 에라토스테네스의 체를 이용하여 푸는 김에

에라토스테네스의 체에 대해서 설명도 같이 하려고 한다.

 

출처: 위키백과

먼저, 에라 토스테네스의 알고리즘부터 순서대로 나열해보겠다.


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


위 설명만 봤을때는 조금 이해하기 어려운 감이 없지않아 있을 수 있다.

하지만, 생각보단 간단하다.

 

소수가 되는 수의 배수들을 모두 지우면 소수만 남는다.

이것을 표현한 알고리즘이다.

조금더 효율적으로 표현하자면 최대 크기의 제곱근보다 작은 소수의 배수들만 지우면 된다.

밑 코드를 보자.

먼저 숫자들을 담을 int 배열 ch를 만들어 줬다. 여기서 조금더 편리하게 작업하기 위해 n+1크기의 배열을 만들어줬다.

이렇게 되야 index값과 숫자의 값이 똑같아진다.

 

그리고 2부터 시작해서 소수이면 answer를 1씩 증가시켜준다. 그리고 소수의 배수들에는 1을 넣어준다.

여기서, ch의 값이 0 이면 소수이고 1이면 소수가 아닌것을 의미한다.

그렇게, 최종적인 answer가 소수의 개수가 된다.



CODE
 

import java.util.*;

public class Main {
    public static int solution(int n){
        int answer= 0;
        int[] ch = new int [n+1];  // 소수이면 0, 소수가 아니면 1
        for(int i=2; i<=n; i++){
            if(ch[i]==0){
                answer++;
                for(int j=i; j<=n; j+=i){
                    ch[j] = 1;
                }
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        System.out.println(solution(n));
    }
}


 

 


결과