소수 찾기
문제: https://programmers.co.kr/learn/courses/30/lessons/12921
1. 문제 설명
1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.
소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)
2. 나의 코드
- 소수 찾기 문제는 구글링만 하면 쉽게 솔루션을 찾을 수 있지만, 이번 문제에서는 풀이보다 효율성이 더 중요한 문제였다.
- 에라토스테네스의 체를 이용하여 문제를 풀었다.
- 주어진 수의 범위 내에서 순서대로 2의 배수를 지우고, 3의배수를 지우고 이런 방식으로 계속 해서 마지막까지 지운다. 남는 수가 바로 소수!
- Time complexity : O(nlogn)
- 계산의 편리성을 위해 n+1 크기의 리스트를 만든다.
- 더미 부분인 isPrime[0]과 소수가 아닌 isPrime[1] 을 False로 한다.
- 나머지 부분은 True로 세팅
- 두개의 for문을 통해 인덱스가 배수에 해당하면, False로 바꾼다.
- True의 개수를 세고 리턴!
import math
def solution(n):
answer = 0
isPrime = [False]
isPrime = isPrime + ([True]*n)
isPrime[1] = False
for i in range(2,n):
for j in range(2,n):
if i*j <= n:
if isPrime[i*j]:
isPrime[i*j] = False
else:
break
answer = isPrime.count(True)
return answer
3. 다른 사람의 코드
-집합인 set을 사용하여, 차집합을 사용해 풀었다.
def solution(n):
num=set(range(2,n+1))
for i in range(2,n+1):
if i in num:
num-=set(range(2*i,n+1,i))
return len(num)

