코딩테스트 준비 💻/Baekjoon
[백준] 자바 Java, 2581번: 기본 수학 > 소수 - 에라토스테네스의 체
ImYena
2021. 8. 28. 03:19
728x90
2581번: 소수
M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.
www.acmicpc.net
문제
자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.
예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.
입력
입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.
M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.
출력
M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.
단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.
알고리즘 분류
- 수학
- 정수론
- 소수 판정
나의 풀이
1. 의식의 흐름대로 풀어본 풀이
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
// 백준 2581 문제] 소수
// 자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램
public class Baekjoon2581 {
public static boolean prime(int n) {
if(n < 2) return false; // 1은 소수도 합성수도 아니다!
// n을 2부터 n-1까지의 수로 n-1(1과 자기자신 제외) 나눴을 때 나머지가 0이면 합성수
for(int i=2; i<n; i++) {
if(n%i == 0) return false;
}
// 위의 조건문을 모두 통과시 소수이기 때문에 true 리턴
return true;
}
public static void main(String[] args) throws IOException {
// BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Scanner sc = new Scanner(System.in);
int start = sc.nextInt(); // m부터
int last = sc.nextInt(); // n까지
int sum = 0;
ArrayList<Integer> minArr = new ArrayList<Integer>();
for(int i=start; i<=last; i++) {
if(prime(i)) {
sum += i;
minArr.add(i);
}
}
if(minArr.size() == 0) {
System.out.println(-1);
} else {
int min = Collections.min(minArr);
System.out.println(sum);
System.out.println(min);
}
} //main end
}
2. "에라토스테네스의 체" 방법으로 풀어본 풀이
에라토스테네스의 체
그리스의 수학자이자 지리학자인 에라토스테네스가 고안한 소수를 찾는 방법으로, 이 방법으로 소수를 찾으려면, 2부터 시작해 자연수를 차례로 쓴 다음, 2 이외의 2의 배수, 3 이외의 3의 배수,
terms.naver.com
- 에라토스테네스의 체
- 소수(素數)를 찾는 방법
- 2부터 시작해 자연수를 차례로 쓴 다음, 2 이외의 2의 배수, 3 이외의 3의 배수, 5 이외의 5의 배수의 순서로 수를 지워나가 끝에 남는 수가 소수
package level9_basic_math2;
import java.io.IOException;
import java.util.Scanner;
// 백준 2581 문제] 소수
// 자연수 M과 N이 주어질 때 M 이상 N 이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램
public class Baekjoon2581_EratosthenesSieve {
// 에라토스테네스의 체 방법 사용
public static void eratosthenes() {
eratosArr[0] = true;
eratosArr[1] = true;
for(int i = 2; i <= Math.sqrt(eratosArr.length); i++) { // 구하려는 크기의 루트 값까지만 계산해도 모두 체크 가능!
for(int j = i * i; j < eratosArr.length; j += i) {
eratosArr[j] = true;
}
}
}
public static boolean eratosArr[];
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int start = sc.nextInt(); // m부터
int last = sc.nextInt(); // n까지
eratosArr = new boolean[last+1];
eratosthenes();
int sum = 0;
int min = Integer.MAX_VALUE;
for(int i=start; i<=last; i++) {
if(eratosArr[i] == false) { // false == 소수
sum += i;
if(min == Integer.MAX_VALUE) { // 첫 번쨰 소수가 최솟값
min = i;
}
}
}
if(sum == 0) {
System.out.println(-1);
} else {
System.out.println(sum);
System.out.println(min);
}
} //main end
}
- 최솟값 구하는 방법
[JAVA 문법] MIN_VALUE와 MAX_VALUE의 활용
사실 JAVA에서는 Math.max나 Math.min를 활용하면 최댓값과 최솟값을 손쉽게 구할 수 있다. 하지만 ...
blog.naver.com
결과
728x90
반응형