PS/백준

[JAVA] 1929번 소수 구하기

s_omi 2024. 1. 29. 20:13

 

 

1929번: 소수 구하기

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

www.acmicpc.net

 

문제

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

 

입력

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

 

출력

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

 

예제

입력 출력
3 16 3
5
7
11
13

 

 

 

알고리즘

제곱근 반복문으로만 풀어서는 시간 초과로 해결하지 못하고 

꼭 에라토스테네스의 체 알고리즘을 사용해야 시간 내에 해결할 수 있다. 

 

[JAVA] 소수 구하기, 에라토스테네스의 체

에라토스테네스의 체 소수를 구하는 방법 중 하나 i = 2 부터 √N 이하까지 반복하여 자연수들 중 i를 제외한 i의 배수들을 제외시키는 방식 시간복잡도: O(Nlog(log N)) 다음의 그림과 같이 1을 제외

mi-dairy.tistory.com

 

 

 

코드

import java.util.*;

public class Main {
    public static boolean[] sifter;

    public static void Prime(int n) {
        sifter = new boolean[n + 1]; // 기본값 false
        sifter[0] = sifter[1] = true;

        for (int i = 2; i <= Math.sqrt(n); i++) { // 소수 아니면 true로 표시 -> 소수면 false
            if (sifter[i] == true) continue;

            for (int j = i * i; j < sifter.length; j += i) {
                sifter[j] = true;
            }
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int M = in.nextInt();
        int N = in.nextInt();
        Prime(N);

        for (int i = M; i <= N; i++) {
            if (sifter[i] == false) System.out.println(i);
        }
    }
}

 

자연수 N 크기만큼의 boolean 배열을 만들어 준다. 이때 boolean 배열의 초기값으로는 false이라 전체가 다 false가 되어있지만 후에 소수가 아닌 숫자들을 처리할 때 true로 만들어 주어 소수가 아니면 true, 소수이면 false가 되도록 boolean 배열을 수정한다. 

 

그리고 boolean 배열이 다 만들어지면 해당 숫자가 소수인 지 소수가 아닌 지 boolean 배열의 index로 해당 숫자를 넣었을 때 그 결과가 소수가 아니면 true, 소수이면 false로 나오게 된다. 이 문제 같은 경우 소수이면 해당 숫자를 출력해야 하므로 조건을 if(sifter[i] == false) 이렇게 주었다.

'PS > 백준' 카테고리의 다른 글

[JAVA] 11653번 소인수분해  (0) 2024.01.30
[JAVA] 9020번 골드바흐의 추측  (2) 2024.01.30
[JAVA] 2609번 최대공약수와 최소공배수  (0) 2024.01.30
[JAVA] 4948번 베르트랑 공준  (2) 2024.01.30
[JAVA] 1978번 소수 찾기  (2) 2024.01.30