본문 바로가기
Programming/Algorithm

[백준] 2581번 : 소수 (Java)

by 안녕주 2021. 8. 6.

문제

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


코드

 import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        int M = sc.nextInt();
        int N = sc.nextInt();
        
        
        int sum = 0;
        int min = N;

        for(int i = M; i <= N; i++){ //M이상 N 이하
            boolean Test = true;

            if (i == 1){
                continue;
            }

            for (int j = 2; j <= Math.sqrt(i); j++){
                if ( i % j == 0){
                    Test = false;
                    break;
                }
            }

            if (Test){
                sum += i;
                if (min > i){
                    min = i;
                }
            }
        }
        if (sum  == 0 ){
            System.out.println("-1");
        }
        else{
            System.out.println(sum + "\n" + min);
        }
    }
}

풀이

if else문이 많아 졌다.

 

여기서의 포인트는

1. M <= i <= N 일 때 , i가 1인경우는 pass

2. 가운데 for문에서는 2 ~ i의 제곱근의 수를 나누어 떨어지면  소수가 아님, boolean 값 false --> sum과 min을 구하는 if문 실행 X

3. boolean 값이 true면 --> sum은 누적합하고, min은 매번 값을 비교해서 갱신

4. 만약 sum이 0이면 -1출력

댓글