알고리즘/BOJ (JAVA)

(JAVA) 백준 2581번 : 소수

띵킹 2022. 3. 12. 16:43

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

 

2581번: 소수

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

www.acmicpc.net

문제

자연수 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을 출력한다.


범위를 입력받아 범위 내에 있는 소수의 합과 최소값을 구하는 문제

소수 여부를 판별하는 함수를 구현해서 for문을 돌리면 된다.

import java.io.*;
import java.util.*;

public class B_2581 {
    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 M = Integer.parseInt(br.readLine());
        int N = Integer.parseInt(br.readLine());
        int sum = 0;
        ArrayList<Integer> List = new ArrayList<>();
        for (int i = M ; i<=N;i++){
            if(isPrimeNumber(i)){
                List.add(i);
            }
        }
        if(List.size()==0){
            bw.write("-1");
        }
        else{
            Iterator<Integer> it = List.iterator();
            while(it.hasNext()){
                sum += it.next();
            }
            bw.write(Integer.toString(sum));
            bw.newLine();
            bw.write(String.format("%d", Collections.min(List)));
        }
        bw.flush();
    }
    static boolean isPrimeNumber(int x){
        if(x == 1){
            return false;
        }
        for (int i=2; i<x; i++){
            if(x%i==0){
                return false;
            }
        }
        return true;
    }  
}

소수 판별시 무식하게 2부터 나눠보는데도 시간이 오래 걸리지 않았다. 테스트케이스의 숫자가 작은가보다

 

728x90