본문 바로가기

Computer Science/알고리즘 문제풀이

Programmers > Level 1 > #24 소수찾기 [Python]

소수 찾기


문제: 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)