코테/백준

[백준/JAVA] 2581번: 소수

imname1am 2023. 3. 28. 12:32
반응형

🔺 문제

 

2581번: 소수

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

www.acmicpc.net

 

🔺 코드

- 방법1

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

public class Main {
    public static void main(String[] args) throws IOException {	    
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
        int m = Integer.parseInt(br.readLine());
        int n = Integer.parseInt(br.readLine());
        int sum = 0;
        int min = 0;
		
        List<Integer> list = new ArrayList<>();
		
        for(int i = Math.min(m,n) ; i <= Math.max(m,n) ; i++) {
            boolean isPrime = true;

            if(i == 1) isPrime = false;

            for(int j = 2 ; j <= Math.sqrt(i) ; j++) {
                if(i % j == 0) {    // 소수가 아닌 경우
                    isPrime = false;
                    break;
                }
            }

            // 소수인 경우		    
            if(isPrime) {
                sum += i;
                list.add(i);		        
            }
        }

        if(list.size() != 0) {
            System.out.println(sum);
            System.out.println(list.get(0));		    
        }
        else {
            System.out.println(-1);
        }
    }
}
✅ 해결 아이디어
- 리스트를 생성해 여기에 소수를 넣고, 합까지 더한다.
- 최솟값은 리스트의 0번째 원소니까 list.get(0)해서 출력

에라토스테네스의 체 구현할 생각하다가 앗 그럼 최솟값이랑 합 계산은 어떻게 하지? 생각해보다가 일단 이렇게 해보았다...

시간 복잡도가 좋지는 않은...

 

 

- 방법2) 에라토스테네스의 체 사용

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.*;
import java.io.*;
 
public class Main {
    public static final int MAX = 10001;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int M = Integer.parseInt(br.readLine());
        int N = Integer.parseInt(br.readLine());
        
        List<Integer> list = new ArrayList<>();
        int total = 0;
        int min = 0;
        
        // 에라토스테네스의 체
        boolean[] isPrime = new boolean[MAX];
        for(int i = 2 ; i <= N ; i++) {
            isPrime[i] = true;
        }
        
        for(int i = 2 ; i <= Math.sqrt(MAX) ; i++) {
            for(int j = i * i ; j < MAX ; j += i) {
                if(!isPrime[j]) continue;
                isPrime[j] = false;
            }
        }
        
        // 소수들의 합 구하기
        for(int i = M ; i <= N ; i++) {
            if(isPrime[i]) {
               total += i;
               list.add(i);
            }
        }
        
        if(list.size() == 0) {
            System.out.println("-1");
        }
        else {
            System.out.println(total);
            System.out.println(list.get(0));            
        }
    }
}
cs


🔺 다른 풀이들

 

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

https://www.acmicpc.net/problem/2581 2581번: 소수 M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 소수가 없을 경우는

st-lab.tistory.com

에라토스테네스의 체를 사용해서 풀어주셨다!👍👍

반응형