<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
리팩토링을 하니 문제 풀이에 어떤 로직을 사용했는지
명확하게 드러나는 것 같아서
세부적인 알고리즘을 파악하고 변경하기에도 용이한 것 같다.