본문 바로가기
PS/BOJ

백준 24039 자바 - 2021은 무엇이 특별할까? (BOJ 24039 JAVA)

by Nahwasa 2022. 3. 4.

문제 : boj24039

 

 

  우선 연속한 두 소수를 알 수 있어야 한다. 이건 에라토스테네스의 체로 미리 특정 수까지의 소수를 구해두면 된다. 결론적으로 103까지의 모든 소수만 구하면 된다(어차피 상관없는게, 답은 무조건 있고 N보다 큰 수만 나오면 멈추면 되므로 대충 많이 구하면 된다.). 이후 연속한 두 소수를 곱해나가다가 N보다 큰 곱이 나오면 출력하면 된다.

 

 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
    private static final int MAX = 103;

    private int getAnswer(int n) {
        ArrayList<Integer> pn = new ArrayList<>();
        pn.add(2);

        boolean[] arr = new boolean[MAX+1];
        int sqrtMax = (int) Math.sqrt(MAX);

        for (int base = 3; base <= sqrtMax; base+=2) {
            if (arr[base]) continue;
            int tmp = base+base;

            while (tmp <= MAX) {
                arr[tmp] = true;
                tmp += base;
            }
        }

        for (int i = 3; i <= MAX; i+=2) {
            if (!arr[i])
                pn.add(i);
        }

        for (int i = 1; i < pn.size(); i++) {
            if (pn.get(i) * pn.get(i-1) > n) {
                return pn.get(i) * pn.get(i-1);
            }
        }
        return -1;
    }

    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print(getAnswer(Integer.parseInt(br.readLine())));
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글