소수(prime number)는 자신보다 작은 2개의 자연수를 곱해 만들 수 없는 1보다 큰 자연수를 말한다. 이와 같은 의미로 1과 자기 자신 외에 약수가 존재하지 않는 수를 말한다.

코딩 테스트에서는 이러한 소수를 판별하는 방식을 묻는 소수 구하기 문제가 종종 출제된다.

소수 구하기의 핵심 이론

소수를 구하는 대표적인 판별법으로는 에라토스테네스의 체를 들 수 있다.

에라토스테네스의 체 원리

  1. 구하고자 하는 소수의 범위만큼 1차원 배열을 생성한다.
  2. 2부터 시작하고 현재 숫자가 지워지지 않을 때는 현재 선택된 숫자의 배수에 해당하는 수를 배열에서 끝까지 탐색하면서 지운다. 이때 처음으로 선택된 숫자는 지우지 않는다.(소수라서)
  3. 배열의 끝까지 2를 반복한 후 배열에서 남아 있는 모든 수를 출력한다.

에라토스테네스의 체 원리 이해하기

Untitled

이로써 1~30까지의 수 중 소수는 [2, 3, 5, 7, 11, 13, 17, 19 ,23, 29]가 된다.

<aside> 💡 에라토스테네스의 체를 사용할 때 시간 복잡도


일반적으로 에라토스테네스의 체를 구현하려면 이중 for문을 사용하므로 시간 복잡도가 O(N²) 정도라고 판단할 수 있다. 그러나 실제 시간 복잡도는 최적화의 정도에 따라 다르겠지만, 일반적으로 **O(Nlog(logN))**이다. 그 이유는 배수를 삭제하는 연산으로 실제 구현에서 바깥쪽 for문을 생략하는 경우가 빈번하게 발생하기 때문이다.

</aside>

[1929] 소수 구하기

[1456] 거의 소수 구하기

[1747] 소수 & 팰린드롬 수 중에서 최솟값 찾기

[1016] 제곱이 아닌 수 찾기