개념

소수는 11과 자기 자신만을 약수로 가지는 22 이상의 자연수입니다. 11은 소수가 아닙니다.

약수로 소수 판별하기

22 이상의 자연수 중 소수가 아닌 수를 합성수라고 합니다. 합성수 NN은 N=abN=ab인 두 자연수 a,b>1a,b>1로 나눌 수 있습니다. 두 인수가 모두 N\sqrt N보다 크면 ab>Nab>N이 되므로, 적어도 한 인수는 N\sqrt N 이하여야 합니다.

따라서 22부터 제곱근까지 나누어떨어지는 수가 하나라도 있으면 합성수이고, 하나도 없으면 소수입니다. 22와 33은 이 범위에 검사할 수가 없으며 둘 다 소수입니다. 11은 소수의 정의에서 제외합니다.

2929는 2,3,4,52,3,4,5 중 어느 수로도 나누어떨어지지 않으므로 소수입니다. 3535는 55로 나누어떨어지므로 합성수입니다.

한 수 또는 몇 개의 수만 판정할 때는 이 방법을 사용할 수 있습니다. 예를 들어 1000010000 미만의 한 수라면 100100 미만의 후보만 확인합니다. 일정 범위의 모든 수를 판정하거나 같은 범위의 수가 소수인지 여러 번 확인할 때는 에라토스테네스의 체로 각 수의 소수 여부를 미리 저장해 둘 수 있습니다.

복잡도

판별할 자연수를 NN이라고 합니다.

연산시간복잡도공간복잡도
소수 판별O(N)O(\sqrt N)추가 O(1)O(1)

예제

문제

주어진 양의 정수가 소수인지 판별하여라.

입력

첫째 줄에 양의 정수 NN이 주어진다. 1≤N≤9 9991\le N\le9\,999이다.

출력

소수이면 YES, 아니면 NO를 출력한다.

예제 입력

29

예제 출력

YES

예제 코드

C++20

#include <iostream>

using namespace std;

int main() {
    int n, i;
    bool ok;

    cin >> n;
    ok = n >= 2;
    for (i = 2; i <= n / i; ++i) {
        if (n % i == 0) ok = false;
    }

    cout << (ok ? "YES" : "NO") << '\n';
}