< [C++/백준 4134번] 다음 소수

프로그래밍 공부/백준 (C++)

[C++/백준 4134번] 다음 소수

Rocketbabydolls 2024. 1. 27. 15:22

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

 

4134번: 다음 소수

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

www.acmicpc.net

 

 

해결 방법

유명한 소수 판별법을 사용했다. 에라토스테네스의 체를 이용해 sqrt(N) 까지만 나누어 보고 소수인지 아닌지 판별할 수 있었다.

따라서 시간 복잡도도 sqrt(N)이다.

시도해보진 않았지만 범위를 long long 이 아닌 unsigned int 로 하여도 무방할 듯 하다.

 

IsPrime 함수에서 소수를 판별하고, 소수가 아니면 값을 증가시켜 다시 검사해 소수를 찾는다.

※ for문의 i값 범위는 당연히 sqrt(N) 이하지만 양변 제곱을 통해 조건문은 i * i < = num 이 된다.

 

#include <iostream>
#include <algorithm>
using namespace std;
bool IsPrime(long long input)
{
   long long num = input;

    if(num <= 1) return false;
    if(num == 2 || num == 3) return true;
    if(num % 2== 0 || num % 3 == 0) return false;

    for(long long i = 5; i * i <= num ;i++)
    {
        if(num % i == 0) return false;
    }

    return true;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
  
    long long N;

    cin >> N;

    for(int i = 0 ; i < N ; i++)
    {
        long long input;
        cin >> input; 


        while(!IsPrime(input))
            input++;

        cout << input << '\n';
           
    }

    return 0;
}

 

참고해서 읽으면 좋을 글

 

https://makedotworld.tistory.com/13

 

소수 판별법, 왜 루트 N 이하의 수만 나눠보면 되는 것일까?

에라토스테네스의 체 라는 개념을 읽어보면 n이 소수인지 아닌지 판별하기 위해서는 sqrt(n) 이하의 수만 나눠보면 된다고 한다. (sqrt는 루트를 의미함) 근데 왜 sqrt(n) 이하의 수를 나눠보면 알 수

makedotworld.tistory.com