ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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


Designed by Tistory.