백준 문제 풀이/백준 (JAVA)

JAVA 백준 4134 다음 소수 (약수, 배수와 소수 2)

gamja00 2024. 7. 2. 00:19


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


문제

  1. 첫째 줄에테스트 케이스 T개가 주어짐.
  2. 각 테스트 케이스는 한 줄로 이루어지며 정수 n (0 <= n <= 4 * 1000000000)이 주어짐.
  3. 테스트 케이스에 대해서 n보다 크거나 같은 소수 중 가장 작은 소수를 한 줄에 하나씩 출력.

 

초기 코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        int flag = 1;

        for (int i = 0; i < n; i++) {
            int num = Integer.parseInt(br.readLine());

            while (flag == 1) {
                for (int j = 2; j <= num; j++) {
                    if (num == j) {
                        flag = 0;
                    } else if (num % j == 0) {
                        num++;
                        break;
                    }
                }
            }
            System.out.println(num);
            flag = 1;
        }

        br.close();
    }
}

 

...이렇게 푸는 게 아닌 것 같다.

 

[참고] https://velog.io/@gayeong39/%EB%B0%B1%EC%A4%80-4134-%EB%8B%A4%EC%9D%8C-%EC%86%8C%EC%88%98-JAVA

[BigInteger 클래스 관련 설명] https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#isProbablePrime(int)

 

찾아보길 정말 잘한 것 같다. 저런 클래스가 있는 줄도 몰랐다...
클래스 있는 걸 다들 어떻게 알까 똑똑한 사람들
난 그것도 모르고 만들었는데...
내가 관심이 없는 건지 바보인 건지...

 

사람들 정말 똑똑하다

아무튼 저 블로그에 설명이 굉장히 잘 되어 있다.
저 블로그가 아니었으면 저 함수가 문자열 형태의 숫자를 받는 줄 몰랐을 것 같다.

Math 클래스인데 왜 문자열로 받는겨...

 

중간 완성 코드

import java.io.*;
import java.math.BigInteger;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        for (int i = 0; i < n; i++) {
            BigInteger result = new BigInteger(String.valueOf(Integer.parseInt(br.readLine())));
            if (result.isProbablePrime(10)){
                System.out.println(result);
            }else{
                System.out.println(result.nextProbablePrime());
            }
        }

        br.close();
    }
}

 

C에서 자바로 넘어오니까 이게 불편하다.

 

내 컴퓨터 프로그램에서는 잘 돌아가는데 코드만 넣으면 에러가 나서... 시간초과면 몰라도 프로그램에서 뜨지 않는 에러가 나니까 정말 불편하다...

 

최종 코드

import java.io.*;
import java.math.BigInteger;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        for (int i = 0; i < n; i++) {
            BigInteger result = new BigInteger(String.valueOf(Long.parseLong(br.readLine())));
            if (result.isProbablePrime(10)){
                System.out.println(result);
            }else{
                System.out.println(result.nextProbablePrime());
            }
        }

        br.close();
    }
}

 

오류 났던 건 주어질 정수 범위 때문이었던 것 같다.
정수 받을 부분을 Long.parseLong(br.readLine()으로 고쳤더니 잘돌아간다.

 

처음 보는 클래스를 써봐서... 신기했다...