정수 n(0 ≤ n ≤ 4*109)가 주어졌을 때, n보다 크거나 같은 소수 중 가장 작은 소수 찾는 프로그램을 작성하시오.
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다.
각각의 테스트 케이스에 대해서 n보다 크거나 같은 소수 중 가장 작은 소수를 한 줄에 하나씩 출력한다.
생각보다 단순해보이는 문제였다. 소수인지 확인하는 로직은 생각보다 쉬웠기 때문에 바로 코드를 작성해보았다.
소수인지 판별할때 while문을 사용할까 했는데 그럴 필요가 없었다.
수정 전 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main
public static long search(long n){
if(n!=1){
for(int i=1; i<=n/2; i++){
if(n%i == 0) {
n++;
i=1;
}
}
}
return n;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
long n;
for(int i=0; i<T; i++){
n = Long.parseLong(br.readLine());
System.out.println(search(n));
}
}
}
그 결과...
런타임 에러가 떴다... 😭😭
문제를 잘 읽어보니 큰 수의 정수가 주어질 수 있다는 사실을 깨달았다.
이전에도 비슷한 경우가 있어 모든 변수 타입을 long
으로 바꾸고 Long.parseLong(br.readLine())
또한 바꾸었다.
그리고 다시 제출한 결과...
이번에는 시간 초과가 나왔다..... 😡😡
직접 로직을 짜서 풀어보려고 했지만 아마 for문에서 시간 초과가 나오는거 같아 BigInteger
를 사용하기로 결정했다.
BigInteger에는 다음과 같은 메소드를 제공한다.
참고 : BigInteger을 초기화하기 위해서는 문자열을 인자 값으로 넘겨주어야 한다.
그렇게 로직을 수정하고 제출하니
드디어 성공했다!! 😀😀
이를 통해 BigInteger라는 것의 존재를 알게 되었고 .isProbablePrime(10)
과 .nextProbablePrime()
를 통해 소수를 구할 수 있다는 것을 알게되었다!!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
long n;
for(int i=0; i<T; i++){
n = Long.parseLong(br.readLine());
BigInteger bigInt = new BigInteger(String.valueOf(n));
if (bigInt.isProbablePrime(10)) {
System.out.println(bigInt);
}
else {
System.out.println(bigInt.nextProbablePrime());
}
}
}
}
문제 링크 : 4143번: 다음 소수