Hope Everyone Is Happy

[실버 3] 1929. 소수 구하기 (Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[실버 3] 1929. 소수 구하기 (Java)

J 크 2023. 8. 2. 23:08
728x90
반응형

https://www.acmicpc.net/problem/1929

 

1929번: 소수 구하기

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

www.acmicpc.net

소수 구하기 에라토스테네스의 체를 구현해볼겸 소수 구하기 문제를 풀어보았습니다.


※  문제를 요약하면 아래와 같습니다.

M 이상 N 이하의 소수를 모두 출력

◈ Input

3 16

◈ Output

3
5
7
11
13

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

 에리스토테네스의 체 구현

2부터 N까지의 모든 자연수를 나열

 2부터 N까지 본인을 제외한 모든 배수 지우기

 남은 수는 소수로 판정

 ( Ref : https://namu.wiki/w/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98%20%EC%B2%B4)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class Main{

	public static void main(String[] args) throws IOException  {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		
		
		StringTokenizer strToken = new StringTokenizer(bf.readLine());
		
		int M = Integer.parseInt(strToken.nextToken());
		int N = Integer.parseInt(strToken.nextToken());
		
		// 에라토스테네스의 체
		// 1. 2부터 N까지의 모든 자연수를 나열
		// 2. 남은 수 중에서 아직 처리하지 않은 가장 작은 수 i를 찾는다.
		// 3. 남은 수 중에서 i의 배수를 모두 제거 (i는 keep!)
		// 4. 더 이상 반복할 수 없을 때까지 2번과 3번 과정 반복
		
		boolean[] bIsPrime = new boolean[N+1];
		
		bIsPrime[1] = true; // 1은 소수아님.
		
		for(int i = 2; i <= N; i++) {
			if(bIsPrime[i])
				continue;
			
			for(int j = i*2; j <= N; j+=i) {
				if(!bIsPrime[j])
					bIsPrime[j] = true;
			}
				
		}
		
		for(int i = M; i <= N; i++) {
			if(!bIsPrime[i])
				System.out.println(i);
		}
		
	}
}

 멍청하게 문제를 제대로 안보고 2부터 N 까지 출력만 계속 제출하다가 출력 오류만 잔뜩 떴네요.. 어이 없는 실수를,, ㅠㅠ

읽어주셔서 감사합니다!

Good Luck! (피드백 고맙습니다)