
- 소수 판별법: N이 주어졌을 때 N을 2부터 N-1까지의 모든 수로 나누어봐 나누어떨어지는 수가 하나라도 존재하면 소수 아님
=> 시간복잡도가 O(N)이기에 비효율적- 알고리즘 개선: 제곱근까지만 확인하면 됨
=> 시간복잡도가 O(N의 2분의 1승)에라토스테네스의 체
- 여러 개의 수가 소수인지 아닌지를 판별할 때 사용
(N보다 작거나 같은 모든 소수를 찾을 때 사용)
=> 시간복잡도가 O(NloglogN)
- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
- 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
이 문제에서는 입력하는 수의 개수가 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);
}
}
