티스토리 뷰
728x90
소수란?
2보다 큰 자연수 중에서 1과 자기 자신을 제외한 자연수로는 나누어 떨어지지 않는 자연수
1. 2부터 n-1까지 모두 확인해보기
def is_prime_number(x):
# 2부터 (x-1)까지의 모든 수를 확인
for i in range(2, x):
# x가 해당 수로 나누어 떨어지면
if x % i == 0:
return False
# 나누어 떨어지는 경우가 없으면
return True
시간복잡도 : O(x) → x의 크기가 크면 비효율적
2. 2부터 제곱근까지만 확인해보기
예) 16의 약수 : [1, 2, 4, 8, 16]
해당 수를 살펴보면 가운데 수를 기준으로 대칭적으로 곱을 통해 16을 만들 수 있다. 이를 통해, 소수의 절반에 해당하는 제곱근까지만 살펴보면 소수 판별이 가능하다는 것을 알 수 있다.
import math
def is_prime_number(x):
# 2부터 x의 제곱근까지의 모든 수를 확인
for i in range(2, int(math.sqrt(x))+1):
# x가 해당 수로 나누어 떨어지면
if x % i == 0:
return False
# 나누어 떨어지는 경우가 없으면
return True
math 라이브러리를 사용하지 않고 다음과 같이 사용할 수 있음을 알아두자.
def is_prime_number(x):
# 2부터 x의 제곱근까지의 모든 수를 확인
for i in range(2, int(x**0.5)+1):
# x가 해당 수로 나누어 떨어지면
if x % i == 0:
return False
# 나누어 떨어지는 경우가 없으면
return True
시간복잡도 : O(x^(1/2))
3. 에라토스테네스의 체
에라토스테네스의 체를 이용한 방법의 경우 범위 내의 모든 수에 대해 소수를 판별하게된다.
- 2부터 N까지의 모든 자연수를 나열한다.
- 남은 수 중에서 아직 처리하지 않은 가장 작은 수 i를 찾는다.
- 남은 수 중에서 i의 배수를 모두 제거한다. (i는 제거하지 않는다 )
- 더 이상 반복할 수 없을 때까지 2번과 3번의 과정을 반복한다.
import math
def is_prime_numebr(x):
# 처음엔 모든 수가 소수(True)인 것으로 초기화(0과 1은 제외)
array = [True for i in range(n+1)]
# 에라토스테네스의 체
# 2부터 n의 제곱근까지의 모든 수를 확인
for i in range(2, int(math.sqrt(n))+1):
# i가 소수인 경우(남은 수인 경우)
if array[i] == True:
# i를 제외한 i의 모든 배수를 제거
j = 2
while i * j <= n:
array[i * j] = False
j += 1
# 2부터 n까지의 모든 수에 대하여 소수 판별
return [i for i in range(2, n+1) if array[i]]
시간복잡도 : O(xloglogx) → but x크기 만큼의 메모리가 필요
Ref.
알라딘: 이것이 취업을 위한 코딩 테스트다 with 파이썬 (aladin.co.kr)
728x90
'Algorithm' 카테고리의 다른 글
[CodingTest] 2021 카카오 채용 연계형 인턴십 : 거리두기 확인하기 (0) | 2021.07.19 |
---|---|
[CodingTest/Python] 10진수를 n진수로 변환하기 & n진수를 10진수로 변환하기 (1) | 2021.05.10 |
[JAVA] 문자(열)을 다루는 다양한 방법 (0) | 2021.03.31 |
[JAVA] StringBuilder - 출력 메소드 호출 빈도 낮추기 (0) | 2021.03.31 |
[JAVA] 백준 - 1차원 배열 (0) | 2021.03.29 |
댓글
공지사항
최근에 올라온 글