시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 128 MB | 102604 | 48561 | 39247 | 47.643% |
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
주어진 수들 중 소수의 개수를 출력한다.
4
1 3 5 7
3
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
public class P_1978 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[] array = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
ArrayList<Boolean> list = new ArrayList<>(1001);
list.add(false);
list.add(false);
for (int i = 2; i <= 1000; i++)
list.add(i, true);
for (int i = 2; i * i <= 1000; i++) {
if (list.get(i)) {
for (int j = i * i ; j <= 1000; j+=i) list.set(j, false);
}
}
int cnt = 0;
for (int num : array) {
if (list.get(num))
cnt++;
}
bw.write(Integer.toString(cnt));
bw.flush();
}
}
에라토스테네스의 체를 이용했다.
자료형이 boolean인 ArrayList를 선언해 소수일 경우 true로 설정하고, 합성수일 경우 해당 인덱스를 false로 설정했다.
먼저, 소수가 아닌 0과 1은 false로 설정을 해 두고 시작을 하고, 나머지 수는 for문을 통해 true로 설정을 한다.
그리고 2부터 2를 약수로 가지는 모든 수를 false로 바꿔준다.