# 문제
주소: https://www.acmicpc.net/problem/2581
# 코드
v1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class BOJ2581_v1 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int M = Integer.parseInt(br.readLine());
int N = Integer.parseInt(br.readLine());
ArrayList<Integer> nums = new ArrayList<>();
// M ~ N 사이의 소수 구하기 계산
for (int i = M; i <= N; i++) {
ArrayList<Integer> other = new ArrayList<>();
// M ~ N 사이의 나머지가 0인 자연수 구하기
for (int j = 1; j <= i; j++) {
int num = i % j;
if (num == 0) {
other.add(j);
}
}
// 소수 구하기
if (other.size() == 2) {
nums.add(i);
}
}
if (nums.size() == 0) {
System.out.println(-1);
} else {
// 전체 합과 가장 작은 수 구하기
int sum = 0;
int min = nums.get(0);
for (int n : nums) {
sum += n; // 합
if (min > n) { // 최소값
min = n;
}
}
System.out.println(sum);
System.out.println(min);
}
br.close();
}
}
v2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class BOJ2581_v2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int M = Integer.parseInt(br.readLine());
int N = Integer.parseInt(br.readLine());
List<Integer> primes = new ArrayList<>();
// 소수 판별하여 primes에 추가
for (int i = M; i <= N; i++) {
if (isPrime(i)) {
primes.add(i);
}
}
if (primes.isEmpty()) {
System.out.println(-1); // primes에 값이 없으면 -1
} else {
int sum = primes.stream().mapToInt(Integer::intValue).sum();
int min = Collections.min(primes);
System.out.println(sum);
System.out.println(min);
}
}
// 소수 판별
private static boolean isPrime(int num) {
// num이 2미만이면 false. 1은 소수가 아니기 때문.
if (num < 2) return false;
// 루트 num이 i로 나누었을 때 나머지가 0이면 소수가 아님.
// 왜냐하면 소수는 1과 본인과 같은 수만 있기 때문에.
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
}
# 입/출력 결과
v1
v2
# 과정
v1
// 풀이 내용:
// 1. BufferedReader로 입력값 받기.
// 2. int M, int N에 각각 입력값 받기.
// 3. 소수인 값을 담기 위해 nums를 ArrayList로 선언.
// 4. M~N 사이를 순환하기 위해 for문 사용.
// 5. M~N 사이의 나머지가 0인 자연수를 ArrayList<Integer> 타입의 other을 생성하고 .add()메서드를 사용하여 추가하기.
// 6. other의 크기가 2인 값을 구하여 nums에 추가하기.
// 7. if문을 사용하여 nums에 값이 없으면 -1을 출력, 그러지 않으면 nums의 요소들을 전체 합한 값은 sum, 가장 작은 수를 min에 저장하여 출력.
v2
// 풀이 내용:
// 1. BufferedReader로 입력값 받기.
// 2. int M, int N에 각각 입력값 받기.
// 3. 소수인 값을 담기 위해 primes를 ArrayList로 생성.
// 4. for문을 사용하여 M~N사이의 자연수 중 소수를 판별하여 primes에 추가.
// - isPrime 메서드를 생성하여 소수 판별함.
// 5. 소수 판별하는 isPirme 메서드 boolean 타입으로 생성.
// - isPirme으로 넘어온 파라미터를 int num으로 함.
// - num < 2 이면 false를 return. (소수는 1 이상의 자연수)
// - for문 사용하여 조건식에 int i = 2; int i < Math.sqrt(num); i++ 로 지정.
// - 블럭에는 num % i 가 0이면 false를 return함. (num을 i로 나누었을 때 0으로 떨어지면 소수가 아님. 소수는 1과 본인과 동일한 수만 가지기 때문에.)
// - 위에 조건들이 부합하지 않으면 true를 return함.
// 6. 본 코드로 돌아와서 primes에 아무런 값이 없으면 -1을 출력하고, 값이 있으면 primes안에 있는 요소의 총 합과 가장 작은 수를 구하여 출력.
// - 총 합은 .stream()을 사용하여 .mapToInt()로 숫자로 형변환 한 다음에 전체 값을 .sum() 메서드 사용하여 전체 합을 구함.
// - Collections 클래스를 사용하여 .min() 메서드로 primes 리스트 안에 있는 요소 중 가장 작은 수를 구하기.
# 메모
- if문, for문을 사용하여 코드를 작성할 수는 있으나, 그 다음 step으로 넘어가기에는 부족하다는 걸 느꼈다.
- 자주 사용되는 클래스, 메서드 이런걸 더 알아야하고 사용 방법을 알아야한다는 계기가 되었다.
'코딩 테스트' 카테고리의 다른 글
[코딩테스트] 백준 11653번: 소인수분해 (0) | 2025.08.03 |
---|---|
[코딩테스트] 백준 1978번: 소수 찾기 (0) | 2025.08.01 |
[코딩테스트] 백준 9506번: 약수들의 합 (0) | 2025.07.28 |
[코딩테스트] 백준 2501번: 약수 구하기 (0) | 2025.07.28 |
[코딩테스트] 백준 5086번: 배수와 약수 (0) | 2025.07.28 |