티스토리 뷰

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

 

풀이

 

IntStream을 두 번 사용해서 문제를 풀었다.

 

역시 연산속도 향상을 위해 2부터 sqrt(a)까지만 순회했으며

 

소수가 없는 경우 -1을 출력하기 위해서 최솟값을 OptionalInt로 받은 후,

 

.empty()를 이용해 값이 없는 경우를 골라냈다.

 

결과적으로 코드가 조금 지저분해진 것 같지만, 만족.

import java.util.OptionalInt;
import java.util.Scanner;
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();

        int result1 = IntStream.rangeClosed(m, n)
                .filter(a -> a > 1)
                .filter(a -> IntStream.rangeClosed(2, (int)Math.sqrt(a)).allMatch(b -> a % b != 0))
                .sum();

        OptionalInt result2 = IntStream.rangeClosed(m, n)
                .filter(a -> a > 1)
                .filter(a -> IntStream.rangeClosed(2, (int)Math.sqrt(a)).allMatch(b -> a % b != 0))
                .min();

        if(result2 == OptionalInt.empty()) System.out.println(-1);
        else{
            System.out.println(result1);
            System.out.println(result2.getAsInt());
        }
    }
}
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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 31
글 보관함