백준 문제 풀이/백준 (JAVA)
JAVA 백준 4134 다음 소수 (약수, 배수와 소수 2)
gamja00
2024. 7. 2. 00:19
https://www.acmicpc.net/problem/4134
문제
- 첫째 줄에테스트 케이스 T개가 주어짐.
- 각 테스트 케이스는 한 줄로 이루어지며 정수 n (0 <= n <= 4 * 1000000000)이 주어짐.
- 테스트 케이스에 대해서 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()으로 고쳤더니 잘돌아간다.
처음 보는 클래스를 써봐서... 신기했다...