https://www.acmicpc.net/problem/1978
문제
> 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
접근
주어진 수에 대해 2부터 시작하는 어떤 수로 계속 나누는데 이 어떤 수의 제곱이 주어진 수보다 작거나 같을 때 까지만 나누어본다. 이는 쉽게 말해 약수를 구하는 과정이라고 할 수 있다. 6의 약수는 1,2,3,6이 된다. 2x3이 6이고 3은 3x2가 6이므로 반복되게 된다.
문제해결
> 입력받을 수의 개수 N을 입력받고 N번만큼 반복해 수를 다룬다.
> 소수반별용 부울 변수 valid를 true로 선언해주고 1은 소수가 아니므로 이를 예외 처리해준다.
> 이제 2부터 j의 제곱이 입력받은 수보다 작거나 같을 때까지 나눠본다.
> 이때 나머지가 0이면 입력받은 수의 약수가 되는것, 즉 소수가 아니게 되므로 valid를 false로 반환하고 더 이상 나눠볼 필요 없이 반복을 깬다.
> 이제 valid의 값에 따라 참이면 cnt를 누적하고 false면 이 누적을 스킵한다.
> 누적된 cnt를 출력한다.
코드
import java.io.*;
import java.util.*;
import java.lang.*;
public class Main
{
//1978번 소수찾기
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int cnt = 0;
for(int i = 0; i < N; i++)
{
int num = Integer.parseInt(st.nextToken());
boolean valid = true;
if(num == 1) continue;
for(int j = 2; j * j <= num; j++)
{
if(num % j == 0)
{
valid = false;
break;
}
}
if(valid) cnt++;
}
System.out.println(cnt);
}
}

후기
로직 자체는 쉬운데 이걸 메소드로 따로 빼서 하고싶다. 자바에서 메소드를 선언하는 방법을 알아보자