PS/백준

[JAVA] 1978번 소수 찾기

s_omi 2024. 1. 30. 09:57

문제

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

 

입력

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

 

출력

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

 

예제

입력 출력
4
1 3 5 7
3

 

 

 

알고리즘

제곱근 반복문으로도 풀리지만 나는 에라토스테네스의 체 알고리즘을 사용하여 해결하였다. 

 

[JAVA] 소수 구하기, 에라토스테네스의 체

에라토스테네스의 체 소수를 구하는 방법 중 하나 i = 2 부터 √N 이하까지 반복하여 자연수들 중 i를 제외한 i의 배수들을 제외시키는 방식 시간복잡도: O(Nlog(log N)) 다음의 그림과 같이 1을 제외

mi-dairy.tistory.com

 

 

 

코드

import java.util.*;

public class Main {
    public static boolean[] prime = new boolean[1001];

    public static void IsPrime() {
        prime[0] = prime[1] = true;

        for (int i = 2; i < Math.sqrt(prime.length); i++) {
            if (prime[i] == true) continue;

            for (int j = i * i; j < prime.length; j += i) {
                prime[j] = true;
            }
        }

    }

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

        for (int i = 0; i < N; i++) {
            if (prime[in.nextInt()] == false) num++;
        }

        System.out.print(num);
    }
}

 

주어지는 수의 최대값은 1000이므로 boolean 배열의 크기를 1001로 지정해서 주었다.

이 문제 같은 경우 소수이면 개수를 +1 해야 하므로 조건을 if(prime[in.nextInt()] == false) 이렇게 주었다.

'PS > 백준' 카테고리의 다른 글

[JAVA] 11653번 소인수분해  (0) 2024.01.30
[JAVA] 9020번 골드바흐의 추측  (2) 2024.01.30
[JAVA] 2609번 최대공약수와 최소공배수  (0) 2024.01.30
[JAVA] 4948번 베르트랑 공준  (2) 2024.01.30
[JAVA] 1929번 소수 구하기  (0) 2024.01.29