소수를 찾는 방법으로 하나 외우고 있으면 좋을것 같다
소수를 찾는 코테 문제하나를 풀어봤는데 기존에 모든 경우의 수(2와 3부터 시작하는 모든 홀수)
를 넣어서 찾는 방법은 시간초과가 되어버렸다.(소수탐색 자체만 해도 O(n)이고 만약 두 소수의 곱으로 이뤄진 숫자에서 두 소수를 찾아라 하는 문제일 경우 반복문을 이용해야 되므로 O(n^2)의 경우가 되는 문제가 있었다.)
에라토스테네스의 체를 사용한다면 O(N^1/2)의 시간복잡도로 계산할수 있다
주로 대량의 소수를 한꺼번에 판별해야할 경우에 사용한다
- 방식(파이썬)
-
- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다
- 2부터 시작해서 나열된 수에서 지워지지 않은 수 중 가장 작은 2를 소수로 선택하고 2의 배수를 지운다.
- 3도 지워지지 않았기 때문에 소수로 선택하고 3의 배수를 지운다
- 4는 지워졌기 때문에 넘어가고 5를 소수로 선택학고 5의 배수를 지운다.
- 2,3,4와 같은 과정을 반복한다
- 반복이 끝나면 지워지지 않은 수들을 소수로 출력한다.가장 먼저 소수를 판별할 범위만큼 배열을 할당하여, 해당하는 값을 넣어주고, 이후에 하나씩 지워나가는 방법을 이용한다.
-
- 소스코드
-
n=100 a = [True] * n+1 #n의 최대 약수는 sqrt(n) 이하이므로 i=sqrt(n)까지 검사한다. #루트의 경우 sqrt대신 **0.5로 사용하였다. m = int(n**0.5) for i in range(2,m+1): if a[i] == True: for j in range(i+i,n+1,i): a[j] = False print([i for i in range(2,n+1) if a[i] == True])
-
'알고리즘' 카테고리의 다른 글
[프로그래머스 - Level 2] 카펫 (0) | 2021.11.08 |
---|---|
[프로그래머스 - Level 2] 구명보트 (0) | 2021.11.08 |
[프로그래머스 - Level 2] 올바른 괄호 (0) | 2021.11.03 |
[프로그래머스 - Level 2] 땅따먹기 (0) | 2021.10.29 |
[프로그래머스 - Level 2] N개의 최소공배수 (0) | 2021.10.26 |