티스토리 뷰

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

 

풀이

 

소수를 찾는 방법에는 왕도가 없다.

 

에라토스테네스의 체를 통해 노가다 횟수를 줄이고 입/출력과 반복 시간을 줄이는 것 외에는.

 

해서 코드라도 짧게 적어보고자 스트림의 summarizingInt() 메서드를 활용해 보았다.

 

호시탐탐 사용할 기회만 노리고 있었는데, 연습하기 좋았다.

import java.util.IntSummaryStatistics;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Prob2581Stream {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int m = sc.nextInt();
        int n = sc.nextInt();

        IntSummaryStatistics result = IntStream.rangeClosed(m, n)
                .filter(a -> a > 1)
                .filter(a -> IntStream.rangeClosed(2, (int)Math.sqrt(a)).allMatch(b -> a % b != 0))
                .boxed()
                .collect(Collectors.summarizingInt(a -> a));

        if (result.getCount() == 0) System.out.println(-1);
        else {
            System.out.println(result.getSum());
            System.out.println(result.getMin());
        }
    }
}
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함