알고리즘

백준 24039 2021은 무엇이 특별할까?

킨글 2024. 9. 4. 22:47

설명

  • 기본적인 아이디어는 3부터 시작해서 값을 prevNum과 nextNum을 2개 기억하면서 둘이 계속 곱해준다.
    만약 곱해준 값이 입력 받은 N보다 크면 정답을 출력해준다. 
  • num이 3부터 시작하도록 초기값 설정
  • 소수가 2부터 시작하므로 2로 초기화 해줌. 
  • next를 prev로 옮겨주고 next에 num을 넣어줌
  • num이 prevNum보다 작은 경우 prevNum에 그대로 넣음 
  • 곱한값이 N 보다 높으면 break;

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {

    // 24039
    public static void main(String[] args) throws IOException {
        process();
    }

    private static void process() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());
        // 초기값 설정
        int num = 3;
        // 소수가 2부터 시작하므로 2로 초기화 해줌. 
        int prevNum = 2;
        int nextNum = 2;
        while(true) {
            if(isPrimeCustom(num)) {
            	
                if(num > prevNum) {
                	// next를 prev로 옮겨주고 next에 num을 넣어줌 
                    prevNum = nextNum;
                    nextNum = num;
                } else {
                	// num이 prevNum보다 작은 경우 prevNum에 그대로 넣음 
                    prevNum = num;
                }
            }

			// 곱한값이 N 보다 높으면 break;
            if(prevNum * nextNum > N) {
                break;
            }

            num++;
        }

        bw.write(prevNum * nextNum  + " ");

        bw.flush();
        bw.close();
        br.close();
    }

    private static boolean isPrimeCustom(int num) {
        boolean isPrime = true;
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (num % i == 0) {
                isPrime = false;
                break;
            }
        }
        return isPrime;
    }
}