코딩테스트/알고리즘 문제

[백준] 1929 소수 구하기- Java

glorypang 2025. 3. 27. 10:00
728x90
반응형
SMALL

📌 문제 정보

  • 출처: 문제 링크
  • 난이도: ⭐
  • 문제 유형: 수학
  • 사용 언어: Java

🔍 문제 설명

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

 

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.


💡 풀이 노트

💡 에라토스테네스의 체란?

고대 그리스의 수학자 에라토스테네스가 만든 방법으로,  소수를 빠르게 찾는 알고리즘

2부터 시작해 배수들을 지워나가며 소수만 남기는 방식.
시간 복잡도는 O($nlog⁡log⁡n$)으로 빠른 편

 

boolean[] num = new boolean[N+1];
Arrays.fill(num,true);
  • 인덱스를 수로 사용하여, 소수인지 여부를 저장하는 배열
  • 처음에는 모두 소수라고 가정( `true`)
num[0] = false;
num[1] = false;
  • `num[0]` ,`num[1]` 은소수가 아니므로 `false` 처리
for(int i =2 ;i <= Math.sqrt(N); i++){
	if(num[i]){
	for(int j = i*i ; j <= N ; j += i)
		num[j] = false;
	}
}
  • `i`의 배수들을 지워나가며 소수가 아닌 것들을 제거

🚀 코드 (Java)

import java.io.*;
import java.util.*;


public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int M = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());

        boolean[] num = new boolean[N+1];
        Arrays.fill(num,true);

        num[0] = false;
        num[1] = false;

        for(int i =2 ;i <= Math.sqrt(N); i++){
            if(num[i]){
                for(int j = i*i ; j <= N ; j += i)
                    num[j] = false;
            }
        }
        for(int i = M ;i <= N ;i++){
            if(num[i]){
                System.out.println(i);
            }
        }
    }
}

🖥 실행 결과

입력
3 16

 

출력
3
5
7
11
13

 


🔄 에라토스테네스의 체 추가 설명

아이디어 요약:

  1. 2부터 시작해서, 그 수의 배수들을 모두 지워나간다.
  2. 지워지지 않고 남은 수는 모두 소수!

예시 (2~26 사이 소수 찾기):

[초기단계] 2부터 26까지의 모든 자연수를 나열 (N = 26)

 

 

[Step 1] 아직 처리하지 않은 가장 작은 수 2를 제외한 2의 배수는 모두 제거

 

 

[Step 2] 아직 처리하지 않은 가장 작은 수 3를 제외한 3의 배수는 모두 제거

 

 

[Step 3] 아직 처리하지 않은 가장 작은 수 5를 제외한 5의 배수는 모두 제거

 

 

[Step 4] 마찬가의 과정을 반복했을 때 최종적인 결과는 다음과 같다

N을 26이라고 설정했다면 제곱근 값은5.xx값이기에 5까지만 확인하면 성공적으로 알고리즘 수행!!

 

 

 

📌 깃허브 코드 저장소: https://github.com/glorypang/CodingTest

 

 

 

728x90
반응형
LIST