4134번: 다음 소수
https://www.acmicpc.net/problem/4134
# 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
long t = Long.parseLong(br.readLine());
// t만큼 반복
for (long i = 0; i < t; i++) {
long n = Long.parseLong(br.readLine());
long x = n;
while (true) {
// 소수이면 sb에 담고 while문 탈출
if (isPrime(x)) {
sb.append(x).append("\n");
break;
}
x++;
}
}
System.out.print(sb);
br.close();
}
// 소수 판별 함수
public static boolean isPrime(long x) {
// 0과 1은 소수가 아님
if (x == 0 || x == 1) {
return false;
}
// Math.sqrt() : 제곱근 함수
for (int j = 2; j <= Math.sqrt(x); j++) {
// 약수가 존재하면 소수가 아님
if (x % j == 0) {
return false;
}
}
// 약수가 존재하지 않으면 소수
return true;
}
}
- 이전에 소수 찾기 문제에서 작성했던 isPrime() 코드를 그대로 가져와 사용한 초기 코드이다.
더 효율적인 코드가 있을 것 같아 다른 제출자분의 코드를 염탐했는데, 시간복잡도가 낮은 상위권 코드들은 모두 6의 배수를 활용하고 있었다.
그래서 아래는 타 코드를 참고해 새롭게 작성해본 코드이다.
설명은 주석으로 대신했다. :D
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
long t = Long.parseLong(br.readLine());
// t만큼 반복
for (long i = 0; i < t; i++) {
long x = Long.parseLong(br.readLine());
while(!isPrime(x)) {
x++;
}
sb.append(x).append('\n');
}
System.out.print(sb);
}
// 소수 판별 함수
static boolean isPrime(long num) {
// 0과 1은 소수가 아님
if (num < 2) return false;
// 2와 3은 소수임
if (num == 2 || num == 3) return true;
// 2 또는 3으로 나누어 떨어지면 소수가 아님
if (num % 2 == 0 || num % 3 == 0) return false;
// 5부터는 6씩 더하며 소수 판별
// 5부터는 소수가 [6k ± 1] 형태이기 때문
for (long i = 5; i <= Math.sqrt(num); i += 6) {
// i 로 나눠 6k - 1 값을 판별하고
// i+2 로 나눠 6k + 1 값을 판별함
if (num % i == 0 || num % (i + 2) == 0) return false;
}
// 소수일 경우 true 반환
return true;
}
}
+
새로운 코드로는 실행 시간이 거의 반으로 줄었다. (✿◡‿◡)
앞으로 소수 문제가 나오면 이렇게 푸는 것이 좋겠다.
'코딩테스트 > 자바 문제풀이' 카테고리의 다른 글
[수학] 9613 GCD 합 (0) | 2024.08.13 |
---|---|
[수학] 백준 21920 서로소 평균 (0) | 2024.08.12 |
[수학] 백준 2609 최대공약수와 최소공배수 (0) | 2024.08.09 |
[수학] 백준 1934 최소공배수 (0) | 2024.08.08 |
[수학] 백준 11653 소인수분해 (0) | 2024.08.07 |