(Java) 백준 1978번 - 소수 찾기

코딩너구리·2026년 1월 20일

코딩 문제 풀이

목록 보기
167/266

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);
    }
}

후기

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

0개의 댓글