
난이도: ★★☆☆☆ • solved on: 2026-01-03

[n, m] 안에 존재하는 모든 소수를 한 줄씩 출력해야 한다.자료구조
boolean[] : 합성수 여부 (표시 배열)StringBuilder : 출력 누적알고리즘/기법
핵심 키워드
- 문제 분해
0과1은 소수가 아니므로 먼저 합성수 취급(true)로 표시한다.2부터 시작해, 아직 체크되지 않은 수(소수 후보)를 만나면 그 수의 배수들을 합성수(true)로 표시한다.- 최종적으로
arr[i] == false인 수만 출력한다(소수만 남김).
핵심 로직 흐름
arr[0] = arr[1] = true // 소수 아님(합성수 취급) for i = 2 .. m: if arr[i] == true: continue for j = 2 while i*j <= m: arr[i*j] = true // 합성수 표시 for i = n .. m: if arr[i] == false: print i예외 처리
0,1은 소수가 아니므로 반드시 제외한다.- boolean 배열의 기본값이
false이므로, “표시되면 합성수(true)” 방식으로 관리한다.
import java.util.*;
import java.io.*;
class Main {
public static boolean[] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
arr = new boolean[m+1];
StringBuilder sb = new StringBuilder();
makeSlieve();
for(int i = n; i <= m; i++){
if(!arr[i]) sb.append(i).append("\n");
}
System.out.println(sb);
}
public static void makeSlieve(){
arr[0] = true;
arr[1] = true;
for(int i = 2; i < arr.length; i++){
if(arr[i]) continue;
for(int j = 2; i*j < arr.length; j++){
arr[i*j] = true;
}
}
}
}
시간 복잡도: 대략 O(M log log M) 수준 (에라토스테네스의 체)
i*j 형태로 마킹하므로 상수는 커질 수 있으나, 기본 아이디어는 체 방식이다.공간 복잡도: O(M) (boolean[m+1])
boolean 배열의 기본값이 무엇인지 몰라서 혼란이 있었다.false라서 의도와 반대로 동작하는 문제가 생겼다.false임을 확인했다.boolean[]의 기본값은 false라서, 보통은 합성수만 true로 마킹하는 형태가 구현이 편하다.j = i*i부터 시작하거나 까지만 돌리면 더 빠르게 만들 수 있다.비슷한 유형 (GPT 추천):
확장 문제 (GPT 추천):