일기 대신 코드 슬쩍

[프로그래머스] Lv1. 소수 찾기 본문

코딩테스트/프로그래머스(Python)

[프로그래머스] Lv1. 소수 찾기

코코자 2023. 1. 30. 21:43

문제 설명

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.(1은 소수가 아닙니다.)

제한 조건

  • n은 2이상 1000000이하의 자연수입니다.

입출력 예

nresult
104
53
def solution(n):
    answer = 1 # 2는 for문에 포함되지 않지만 소수이므로 answer이 1로 시작
    for i in range(3,n+1,2): # 소수= 1과 자기 자신으로만 나누어 떨어짐
        for j in range(2,i): # i라는 수를 2부터 i-1까지 나눴을 때,
            if i % j == 0: # 나누어 떨어지는 수가 있다면 소수가 아님
                break
            elif j == i-1: # 나누어 떨어지는 수가 없다면
                answer += 1 # 소수이므로 answer에 +1
    return answer
  • 시간초과
  • 비효율의 끝판왕인가봐요
def solution(n):
    numbers = list(range(3,n+1,2)) # n까지의 홀수

    for i in range(2,n+1): #에라토스테네스의 체 이용
        if i in numbers: 
            for j in range(2*i, n+1, i):
                if j in numbers:
                    numbers.remove(j)
    return len(numbers)+1 # 소수 2 포함
  • 나름 에라토스테네스의 체 이용해봤는데도 시간초과!
def solution(n):
    numbers = set(range(3,n+1,2)) # n까지의 홀수집합

    for i in range(3,n+1,2): #에라토스테네스의 체 이용
        if i in numbers:
            numbers -= set(j for j in range(2*i, n+1, i))

    return len(numbers) + 1 # 소수 2 포함
  • 점수 +12