알고리즘/백준 알고리즘

[java] 백준 알고리즘 2581번 소수 풀이

희랍인 조르바 2018. 6. 14. 15:58



등차수열 공식을 이용해 시작하는 수(M)부터 끝나는 수(N)까지 총 합을 구하고,


소수가 아닌 수가 나올때마다 총 합에서 그 숫자를 빼주었다.


소수도 M과 N 사이의 숫자에서 소수가 아닌 값이 나올 때마다 빼주어


총 소수의 숫자를 구했다.



* 풀이 소스


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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class Baekjoon2581{
 
    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 primeNumSum = (N-M+1)*(M+N)/2// M부터 N까지 합(등차수열 공식)
        int primeNumCount = N-M+1;
        int[] forFindingMin = new int[N-M+1];
        
        for(int i=M; i<=N; i++) {
            int primeNumber = i;
            int squareRoot  = (int) Math.sqrt(primeNumber);
            int divide = 2;
            
            if(primeNumber > 2) { // 나누는 건 2부터 나눠줘야 의미가 있어서 소수가 2 이상부터
                
                while(squareRoot >= divide) { // 나누는 부분은 나눠지는 수의 제곱근까지만 구해주면 된다.(수학공식)
                    
                    if(primeNumber%divide == 0) {
                        primeNumSum -= i;
                        primeNumCount--;
                        break;
                    }
                    
                    divide++;
                }
                
                if(primeNumber%divide != 0) {
                    forFindingMin[i-M] = primeNumber;
                }
            }else if(primeNumber == 1){ // 1이 입력될 경우 1을 빼줌(1은 소수가 아니니까)
                primeNumSum -= 1;
                primeNumCount -= 1;
            }else if(primeNumber ==2) {
                forFindingMin[i-M] = primeNumber;
            }
            
        }
        
        if(primeNumCount < 1) { // 소수가 하나도 없으면 -1 출력
            bw.write("-1");
        }else {
            bw.write(String.valueOf(primeNumSum));
            bw.newLine();
            for(int min : forFindingMin) {
                if(min != 0) { // int 배열은 디폴트가 0으로 채워져있기 때문에
                               // 0이 아닌 값이 나오는 첫순간이 최소값이다.
                    bw.write(String.valueOf(min));
                    break;
                }
            }
        }
        bw.flush();
        
    }
 
}
 
cs