소수 (Prime Number) 란,
1과 자기 자신으로만 나누어지는 숫자 (단, 1은 소수가 아님)
(1) 특정 N 이 주어졌을 때, 이 숫자가 소수인지 아닌지 판별하기
: N이 n * m (n<=m) 으로 만들어진다고 했을 때, n <= N^1/2 (제곱근) 이다.
즉, 2~N의 제곱근 까지의 모든 수에서 N이 나누어 떨어지지 않을 때 N은 소수라고 정의할 수 있다.
-> N의 제곱근 만큼 반복하기 때문에 시간복잡도는 O(N^(1/2)) 이다.
[Python 코드]
import math
def solution(N):
answer = True
for n in range(2, int(math.sqrt(N)) + 1):
if N % n == 0:
answer = False
break
return answer
(2) N까지의 범위가 주어졌을 때, 소수를 찾아내기 (에라토스테네스의 체)
: 2~N까지 숫자 중에서 제일 작은 숫자 n을 소수로 지정하고, n의 배수가 되는 모든 수를 소수 후보에서 제외한다.
제외되지 않은 숫자 중 가장 작은 다음 숫자 m을 소수로 지정하고, m의 모든 배수를 소수 후보에서 제외한다...
모든 숫자가 지정될 때 까지, 위 작업을 반복하며 소수를 찾아낸다.
[Python 코드]
def solution(N):
li = [True for _ in range(2, N+1)]
for idx, val in enumerate(li):
i = idx+2
if val == False :
continue
for j in range(2,N):
if i*j > N:
break
li[i*j-2] = False
answer = filter(lambda x: x == True, li)
return len(list(answer))
[참고] velog.io/@koyo/python-is-prime-number
'Algorithm > 알고리즘' 카테고리의 다른 글
누적합 구하기 (Prefix Sum) (0) | 2021.07.29 |
---|---|
최소신장트리(MST) 알고리즘 (Prim, Kruskal) (0) | 2021.07.18 |
최단경로 알고리즘 (Dijkstra, Bellman-Ford, Floyd-Warshall) (0) | 2021.07.16 |
Greedy Algorithm (탐욕 알고리즘) (0) | 2021.05.14 |
최대공약수, 최소공배수 구하기 (유클리드 호제법) (0) | 2021.05.06 |