티스토리 뷰

 

문제

 

정수 n(0 ≤ n ≤ 4*109)가 주어졌을 때, n보다 크거나 같은 소수 중 가장 작은 소수 찾는 프로그램을 작성하시오.

 

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

 

4134번: 다음 소수

정수 n(0 ≤ n ≤ 4*109)가 주어졌을 때, n보다 크거나 같은 소수 중 가장 작은 소수 찾는 프로그램을 작성하시오.

www.acmicpc.net

 

 

 

 

 

입, 출력

 

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다.

각각의 테스트 케이스에 대해서 n보다 크거나 같은 소수 중 가장 작은 소수를 한 줄에 하나씩 출력한다.

 

 

 

 

 

풀이

 

3개의 함수로 나누게 되었다.

core(=main) 함수는 숫자를 입력하면 소수를 반환 받은 값을 출력 받는 것이고

find(=logic) 함수는 n 보다 크거나 같은 소수 중 가장 작은 소수를 찾는 것이고

판별(=isPrime) 함수는 해당 num 값이 소수인지 아닌지 판별하는 함수이다.

 

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));

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

        for(int i = 0; i < N; i++){
            long num = Long.parseLong(br.readLine());
            long result = logic(num);
            System.out.println(result);
        }
    }
    
	// find
    public static long logic(long num){
        for(long i = num; ;i++){
            if(isPrime(i)){
                return i;
            }
        }
    }
    
	// 판별
    public static boolean isPrime(long num){
        boolean result = true;
        if(num <= 1) {
            return false;
        }
        for(long i = 2; i <= Math.sqrt(num); i++){
            if(num % i == 0){
                return false;
            }
        }
        return result;
    }
}

 

  • 소수는 2부터 시작하기 때문에 if(num <= 1) 일 때 return false 의 조건을 주었다.
  • 소수를 판별할 때
    for (long i = 2; i * i <= num; i++) {  이것보다
    for (long i = 2; i <= Math.sqrt(num); i++) { 를 사용하여 해결하였다.
    왜냐하면 위에는 i*i라는 곱셈 연산이 필요하고 Math.sqrt 함수는 상수 시간에 가깝게 동작하기 때문에 사용했다.
    특히 매우 큰 숫자에서 Math.sqrt 사용에 있어서 성능이 좋다! 

 

 

 

 

감사합니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함