본문 바로가기
[Python] Programmers/Level1

[프로그래머스/Level1] 소수 찾기

by 파크영 2021. 6. 18.

문제 설명

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

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

 

제한 조건

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

 

입출력 예

n result
10 4
5 3

 

입출력 예 설명

 

입출력 예 #1
1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환

 

입출력 예 #2
1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환


나의 풀이 

[Python(파이썬)]

 

  • 첫번째 코드 - 시간초과, 효율성이 없음
def solution(n):
    num = 1
    for i in range(3, n+1):
        tf = True
        for j in range(2,i):
            if i % j == 0:
                tf = False
                break
        if tf == True:
            num += 1

    return num

 

  • 두번째 코드 - 에라토스테네스의 정리 사용한 코드
def solution(n):
    arr = [True] * (n+1)

    for i in range(2, int(n**0.5)+1):
        for j in range(2*i, n+1, i):
            arr[j] = False
    return arr.count(True)-2
# -2는 arr[0],arr[1]을 빼주기 위해서

 

 


학습한 내용

  • 에리토스테네스의 정리 
 

[Python] 에라토스테네스의 체

에라토스테네스의 체는 수학에서 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견했다. 소수란? 약수가 1과 자기 자신만을 가지는 정수 2부터 구하고자 하는 구간의 모든 숫자

young-library.tistory.com

  • 이번에는 첫번째 코드가 효율성이 좋지 않아서 다른 코드들 참조하면서 문제 풀이했다ㅠㅠ 

 

  • 첫번째 for문 범위 (2 ~ n) 
def solution(n):
    arr = [True] * (n+1)

    for i in range(2, n+1):
        for j in range(2*i, n+1, i):
            arr[j] = False
    return arr.count(True)-2 
# -2는 arr[0],arr[1]을 빼주기 위해서

 

 

  • 첫번째 for문 범위 (2 ~ int(n**0.5)) -> 제곱근 까지
def solution(n):
    arr = [True] * (n+1)

    for i in range(2, int(n**0.5)+1):	# 2부터 제곱근까지
        for j in range(2*i, n+1, i):
            arr[j] = False
    return arr.count(True)-2
# -2는 arr[0],arr[1]을 빼주기 위해서

에라토스테네스의 체를 사용하여 소수인지 확인할 때 n을 2부터 제곱근까지 구하면 더 빠르게 구할 수 있다.  

 

 

문제 출처

 

코딩테스트 연습 - 소수 찾기

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상

programmers.co.kr

 

댓글