https://www.acmicpc.net/problem/1978
따로 소수인지 아닌지를 저장해 주는 값이 필요가 없다고 생각하였다. 하지만, 아래의 내가 작성한 코드는 num값이 소수가 아니어도 cnt가 증가한다. 즉, 내부의 for문을 다 돌리고 나서 이 수가 소수인지 아닌지를 판단한 후 cnt값을 증가시켜 주어야 하는 것이다.
package bronze2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class num1978 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[] input = br.readLine().split(" ");
int cnt = 0;
for (int i = 0; i < N; i++) { //배열의 각 요소를 순회하는 for문
int num = Integer.parseInt(input[i]);
if (num == 1) {
cnt++;
}
for (int j = 2; j <= (int) Math.sqrt(num); j++) { //2부터 그 수의 제곱근까지 나눠보면 소수인지 아닌지 판별 가능
if (!(num % j == 0)) {
cnt++;
}
}
}
System.out.println(cnt);
br.close();
}
}
여기서 유의해야 할 점은 '1은 소수가 아니다'라는 것이다. 또한, 입력이 0보다 작을 수도 있다는 것이다. 이 두가지 케이스를 처음부터 따지지 못해 많이 실패했었다 ㅠㅠ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[] input = br.readLine().split(" ");
int cnt = 0;
for (int i = 0; i < N; i++) { //배열의 각 요소를 순회하는 for문
int num = Integer.parseInt(input[i]);
boolean isPrime = true;
for (int j = 2; j <= (int) Math.sqrt(num); j++) { //2부터 그 수의 제곱근까지 나눠보면 소수인지 아닌지 판별 가능
if (num % j == 0) { //나누어 떨어지는 수가 있으면
isPrime = false; //소수가 아님
break;
}
}
if(num > 1 && isPrime){ //내부 for문이 다 끝나고 난 후에도 isPrime이 true이면 소수이므로 cnt 증가
cnt ++;
}
}
System.out.println(cnt);
br.close();
}
}