문제 풀이/[JAVA_자바] 백준

[JAVA / 자바] 백준 2581번 - 소수

Seunghyun_KO 2021. 12. 27. 09:00
728x90
반응형

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60 이상 100 이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.


입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.

M과 N은 10,000 이하의 자연수이며, M은 N보다 작거나 같다.


출력

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그중 최솟값을 출력한다.

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.


 


문제 접근 방법

이번 문제는 m과 n를 입력받아 그 사이에 소수를 찾아 총 합과 그 최솟값을 구하는 문제로 쉽게 생각하면 n까지의 소수를 에라토스테네스의 체로 구한 후 m부터 n사이 소수의 총 합과 최솟값을 구해주면 되는 쉬운 문제이다.


JAVA 코드 풀이

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        int m = input.nextInt();
        int n = input.nextInt();
        boolean pN[] = new boolean[n+1];
        pN[1] = true;
        for(int i=2; i*i<=n; i++){
            if(!pN[i])
                for(int j=i*i; j<=n; j+=i){
                    pN[j] = true;
                    //System.out.println(j);
                }
        }
        int sum=0;
        int min=0;
        for(int i=m; i<=n; i++){
            if(!pN[i]){
                if(min == 0){
                    min = i;
                }
                sum += i;
            }
        }
        if(sum == 0){
            System.out.println(-1);
        }
        else{
            System.out.println(sum);
            System.out.println(min);   
        }
    }
}

후기

이번 문제는 에라토스테네스의 체만 혹은 에라토스테네스의 체를 몰라도 소수를 구하는 방법을 알고 있다면 쉽게 풀 수 있는 문제라고 생각한다.


문제 원본

https://www.acmicpc.net/problem/2581

728x90
반응형