| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- Deque
- 동적 프로그래밍
- isalpha()
- Recommendation
- find()
- 코테
- 백준
- 알고리즘
- Algorithm
- LSTM
- knowledge
- isalnum()
- 우선순위 큐
- explainable recommendation
- Knowledge graph
- bfs
- 프로그래머스
- Dynamic Programming
- 자료구조
- 추천시스템
- 그래프 탐색
- Python
- Stack
- isnumeric()
- isdigit()
- 정렬
- 파이썬
- 그래프
- DP
- kg
- Today
- Total
데린이 고인물되기
[TIL] 250529 - 소수 판별 알고리즘(파이썬) 본문
소수는 1과 자기 자신만을 약수로 가지는 수입니다. 코딩 테스트에서 자주 등장하는 개념이라, 소수를 판별하는 알고리즘은 꼭 알고 계시는 것이 좋습니다. 이번 글에서는 Python으로 소수를 판별하는 방법 중 대표적인 두 가지를 소개드리도록 하겠습니다.
1. 기본 소수 판별법 (완전탐색 방식)
가장 단순하게 먼저 떠올릴 수 있는 방법은 2부터 n-1까지 전부 나누어보는 것입니다. 만약 하나라도 나누어떨어지면 소수가 아니고, 그렇지 않으면 소수로 판단하는거죠.
def is_prime(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
print(is_prime(7)) # 출력: True (소수)
print(is_prime(10)) # 출력: False (소수 아님)
⚠️ 단점
이 방법은 아주 단순하지만, 검사 횟수가 많아 수가 커질수록 비효율적입니다.
예를 들어 10000이 소수인지 판단하려면 2부터 9999까지 모두 나누어봐야 하므로 시간이 오래 걸립니다.
그래서 사용할 수 있는 방법이 아래 방법입니다.
2. 제곱근까지만 검사하는 방식
실제로는 n의 약수는 항상 $ \sqrt{n} $ 이하 중에 하나는 존재하기 때문에, 2부터 $ \sqrt{n} $ 까지만 나누어보면 됩니다. 이 방법을 적용하면 훨씬 더 빠르게 소수를 판별할 수 있습니다.
import math
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
print(is_prime(7)) # 출력: True
print(is_prime(10)) # 출력: False
🧠원리
어떤 수 n이 소수가 아니라면, n = a × b 꼴로 약수를 가질겁니다.
여기서 a와 b가 모두 $ \sqrt{n} $ 보다 크다고 가정해보면,
a × b > $ \sqrt{n} \times \sqrt{n} = n $이 되어버리므로 모순입니다.
즉, n이 약수를 가진다면 그 약수 중 하나는 반드시 $ \sqrt{n} $ 이하에 존재하게 됩니다.
그러니까 2부터 $ \sqrt{n} $ 까지만 검사해도 약수가 있는지 없는지를 완전히 판단할 수 있는거죠.
예를 들어, 36의 약수는 다음과 같이 짝을 이루게 됩니다.
1×36, 2×18, 3×12, 4×9, 6×6
이렇게 보면, 약수 쌍 중에서 작은 쪽 숫자들은 전부 $ \sqrt{36} = 6 $ 이하입니다.
따라서 그 이하까지만 검사하면 모든 경우를 체크한 것과 같게되는거죠.
'Algorithm > 정리' 카테고리의 다른 글
| [TIL] 250607 - 그래프 (0) | 2025.06.07 |
|---|---|
| [TIL] 250605 - 완전 탐색 가능 여부 판단 기준(시간 복잡도) (0) | 2025.06.05 |
| [TIL] 250531 - 이분탐색(Lower Bound / Upper Bound / Custom Bound) (0) | 2025.05.31 |
| [TIL] 250529 - 파이썬 itertools.permutations 사용법 (0) | 2025.05.29 |
| [TIL] 250409 - BFS (0) | 2025.04.09 |