[백준 | Java] 1978 소수 찾기

알린·2024년 1월 10일

baekjoon

목록 보기
10/68

내 풀이

  • 소수 판별법: N이 주어졌을 때 N을 2부터 N-1까지의 모든 수로 나누어봐 나누어떨어지는 수가 하나라도 존재하면 소수 아님
    => 시간복잡도가 O(N)이기에 비효율적
  • 알고리즘 개선: 제곱근까지만 확인하면 됨
    => 시간복잡도가 O(N의 2분의 1승)

    에라토스테네스의 체

    • 여러 개의 수가 소수인지 아닌지를 판별할 때 사용
      (N보다 작거나 같은 모든 소수를 찾을 때 사용)
      => 시간복잡도가 O(NloglogN)
    1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
    2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
    3. 자기 자신을 제외한 2의 배수를 모두 지운다.
    4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
    5. 자기 자신을 제외한 3의 배수를 모두 지운다.
    6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
    7. 자기 자신을 제외한 5의 배수를 모두 지운다.
    8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
    9. 자기 자신을 제외한 7의 배수를 모두 지운다.
    10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.

이 문제에서는 입력하는 수의 개수가 100개 이하로 많은 양의 수가 아니기 때문에
N 이하의 소수를 구해서 입력과 비교하는 에라토스테네스의 체를 사용하기보단 입력받은 수마다 소수인지 개별로 확인하는 방법이 보다 효율적이라 생각했다.

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

public class Main {
    public static void main(String[] args)  throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        int count = 0;

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            int x = Integer.parseInt(st.nextToken());

            for (int j = 2; j <= x; j++) {
                if (j == x) {
                    count++;
                } else if (x % j == 0) {
                    break;
                }
            }
        }
        System.out.println(count);
    }
}

profile
짱이 되고싶은 개발 기록

0개의 댓글