BOJ 1929. 소수구하기

1 minute read

BOJ 1929. 소수 구하기

image

풀이

입력이 1 <= M <= N <= 1,000,000 이므로  소수 찾기  방식을 사용하면 시간 초과가 발생한다 시간 복잡도를 잘 계산하지 않으면 시간 초과가 발생하는것이다.

시간 복잡도를 줄이기 위해 에라토스테네스의 체 [wiki] 알고리즘을 사용한다 img

1~120까지 수가 있을 때  1을 제외한 지워지지 않은 가장 작은 소수는 2이다.

  • 2의 배수를 모두 제거
  • 3의 배수를 모두 제거
  • 5의 배수를 모두 제거 … …

Java

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        boolean[] check = new boolean[1000001];
        StringBuilder sb = new StringBuilder();

        int min = sc.nextInt();
        int max = sc.nextInt();

        check[1] = true;

        for (int i = 2; i <= max; i++) {
            for (int j = 2; i * j <= max; j++) {
                if (!check[i * j]) {
                    check[i * j] = true;
                }
            }
        }

        for (int i = min; i <= max; i++) {
            if (!check[i]) {
                sb.append(i).append("\n");
            }
        }

        System.out.println(sb);
        sc.close();
    }
}



Kotlin

fun main() {
    val (m, n) = readLine()!!.split(' ').map { it.toInt() }
    val check = BooleanArray(n + 1) { false }
    for (i in 2..n) {
        if (!check[i]) {
            if (i > m) println(i)
            var j = 2
            while (i * j <= n) {
                check[i * j] = true
                j++
            }
        }
    }
}

풀이소스

github.com/beomjo/algorithm-study/blob/main/BOJ/java/1929.java github.com/beomjo/algorithm-study/blob/main/BOJ/kotlin/1929.kt