[백준 알고리즘 문제풀이][JAVA][1978번] 소수 찾기

문제 - 백준 문제 바로가기

주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.



입력

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다.
다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.



출력

주어진 수들 중 소수의 개수를 출력한다.



시간제한

2초



알고리즘 유형

  • 수학
  • 정수론
  • 소수 판정
  • 에라토스테네스의 체


에라토스테네스의 체 - 위키백과 내용 참조.

에라토스테네스의체 이미지


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

그림의 경우, 112 > 120 이므로 11보다 작은 수의 배수들만 지워도 충분하다.
즉, 120보다 작거나 같은 수 가운데 2, 3, 5, 7의 배수를 지우고 남는 수는 모두 소수이다.



예제입력 1

4
1 3 5 7

예제출력 1

3





풀이 1


import java.util.*;

public class Main {

  public static void main(String[] args) {
    go();
  }

  //"에라토스테네스의 체" 이용 ... 맞게 한건진 모르겠음
  private static void go(){

    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();   //확인할 수의 개수
    int[] arr = new int[n];
    for (int i = 0; i < n; i++) arr[i] = sc.nextInt();
    Arrays.sort(arr);
    int max = arr[n-1];
    Map<Integer, Boolean> sosuMap = new HashMap<Integer, Boolean>();    //각 숫자별 소수여부
    sosuMap.put(1, false);  //1은 소수가 아님
    for(int x=2; x<=max; x++) sosuMap.put(x, true);
    for(int x=2; x<max; x++){
      if(sosuMap.get(x)){ //이 아이는 소수임
        for(int y=2; y <= max/x; y++){   //소수인 아이의 배수에 해당하는 아이들을 소수아님 처리
          sosuMap.put(x*y, false);
        }
      }
    }
    int sosuCnt = 0;
    for (int i : arr)  if(sosuMap.get(i)) sosuCnt++;    // 입력된 값들중 소수 찾기
    System.out.println(sosuCnt);
  }

}






GitHub 소스는 여기서 확인 가능 합니다.




마지막 수정