
난이도: ★★★☆☆ • solved on: 2025-07-15

-1을 출력해야 한다.자료구조
boolean[] : 에라토스테네스의 체(Sieve of Eratosthenes)용 배열 알고리즘/기법
핵심 키워드
- 문제 분해
- [2, N] 범위 내 소수 여부를
sieve배열에 표시한다.sieve[0],sieve[1]은false로 미리 처리한다.- 핵심 로직 흐름
// 1) sieve 초기화 boolean[] sieve = new boolean[N+1]; Arrays.fill(sieve, true); sieve[0] = false; sieve[1] = false; // 2) 에라토스테네스의 체 적용 int limit = (int)Math.sqrt(N); for (int i = 2; i <= limit; i++) { if (sieve[i]) { for (int j = i * i; j <= N; j += i) { sieve[j] = false; } } } // 3) M부터 N까지 순회하며 합(sum)과 최솟값(min) 계산 int sum = 0, min = Integer.MAX_VALUE; for (int i = Math.max(M, 2); i <= N; i++) { if (sieve[i]) { sum += i; min = Math.min(min, i); } }
- 예외 처리
M이 1 이하일 경우Math.max(M, 2)로 처리하여 2부터 시작- 소수가 하나도 없으면 (
sum == 0)-1만 출력
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int m = Integer.parseInt(br.readLine());
int n = Integer.parseInt(br.readLine());
int sum = 0;
int min = n;
boolean[] sieve = new boolean[n+1];
Arrays.fill(sieve, true);
sieve[0] = sieve[1] = false;
for(int i=2;i<=Math.sqrt(n);i++){
if(sieve[i]){
for(int j=i*i;j<=n;j+=i){
sieve[j] = false;
}
}
}
for(int i=Math.max(2, m);i<=n;i++){
if(sieve[i]){
sum += i;
if(i < min){
min = i;
}
}
}
if(sum==0){
System.out.print(-1);
} else {
System.out.print(sum + "\n"+min);
}
}
M이 1일 때 2부터 시작하도록 처리하는 걸 처음에는 하지 않아 코드가 불안정하게 작동했다.Math.sqrt(N)는 반복마다 호출하지 않고 변수에 저장하여 사용하면 성능이 향상된다.sieve 배열 크기를 N+1로 선언해야 0부터 N까지 저장이 가능하다.비슷한 유형 (GPT 추천): [1929] 소수 구하기'
확장 문제 (GPT 추천): 구간 분할 세그먼티드 체(segmented sieve) 구현