<problem_solving>/백준 기초 BaekJoon Basic

[JAVA] 백준 2581번 풀이 - 소수

Rizingblare 2023. 12. 22. 15:42

0. Intro

리팩토링에 절여져 버린 나..

 

문제 링크:

https://www.acmicpc.net/problem/2581

 

1. 리팩토링 이후

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int M = scanner.nextInt();
        int N = scanner.nextInt();

        PrimeResult result = PrimeUtils.calculatePrimeSumAndMin(M,N);

        if (!result.hasPrimes()) {
            System.out.println(-1);
        }

        else {
            System.out.println(result.getPrimeSum());
            System.out.println(result.getPrimeMin());
        }
    }

    private static class PrimeUtils {

        public static PrimeResult calculatePrimeSumAndMin(int start, int last) {
            int sum = calculatePrimeSum(start, last);
            int min = calculatePrimeMin(start, last);

            return new PrimeResult(sum, min);
        }


        private static int calculatePrimeSum(int start, int last) {
            int sum = 0;
            for (int i = start; i <= last; i++) {
                if (checkPrime(i)) {
                    sum += i;
                }
            }
            return sum;
        }

        private static int calculatePrimeMin(int start, int last) {
            for (int i = start; i <= last; i++) {
                if (checkPrime(i)) {
                    return i;
                }
            }
            return 0;
        }

        private static boolean checkPrime(int i) {
            if (i < 2) return false;
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    return false;
                }
            }
            return true;
        }
    }

    private static final class PrimeResult {

        private final int primeSum;
        private final int primeMin;

        public PrimeResult(int sum, int min) {
            this.primeSum = sum;
            this.primeMin = min;
        }

        public int getPrimeSum() {
            return primeSum;
        }

        public int getPrimeMin() {
            return primeMin;
        }

        public boolean hasPrimes() {
            return primeMin != 0 || primeSum != 0;
        }
    }
}

 

2. 하드 코딩

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int M = scanner.nextInt();
        int N = scanner.nextInt();

        int sum = 0;
        int min = 0;
        boolean is_min = false;

        for (int i = M; i <= N; i++) {
            if (i == 1) continue;

            boolean is_prime = true;
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    is_prime = false;
                    break;
                }
            }

            if (is_prime) {
                if (!is_min) {
                    min = i;
                    is_min = true;
                }
                sum += i;
            }
        }

        if (!is_min) {
            System.out.println(-1);
        }

        else {
            System.out.println(sum);
            System.out.println(min);
        }
    }
}

 

3. Outro

리팩토링을 하니 문제 풀이에 어떤 로직을 사용했는지

명확하게 드러나는 것 같아서

세부적인 알고리즘을 파악하고 변경하기에도 용이한 것 같다.