알고리즘

프로그래머스Lv.1 - 소수 찾기

하나공신 2019. 12. 23. 10:11

1. 문제


  • 언어 : python3

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

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

 

2. 풀이 결과(소스코드)


def solution(n):
    # 짝수는 소수가 아니므로, 3~n까지 홀수값만 있는 배열 생성
    numbers = set([i for i in range(3, n+1, 2)])
    for i in range(3, n+1, 2):
        if i in numbers:
            # 특정수의 배수는 나누어지는 수가 있는 것이므로 해당 숫자를 배열을 돌면서 해당 배수 삭제
            numbers -= set([i for i in range(i*2, n+1, i)])
    # 배열생성시 3부터 시작했으므로 가장 작은 소수인 2는 제외됨, 따라 +1을 하여 최종적인 소수의 개수 완성
    answer = len(numbers)+1
    return answer

 

3. 회고


소수는 나눠지는 수가 1, 자신 뿐이므로 입력받은수(n)-1까지 이중 for문으로 나누는 것으로 접근했는데 속도 테스트에서 계속 실패했다.

찾아보니 에라토스테네스의 체라는 접근법이 있어서 이대로 했더니 속도가 비교가 안된다...

접근방법은 아래와 같고 자세한 내용은 링크 참고!

 

  1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
  2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
  3. 자기 자신을 제외한 2의 배수를 모두 지운다.
  4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
  5. 자기 자신을 제외한 3의 배수를 모두 지운다.
  6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
  7. 자기 자신을 제외한 5의 배수를 모두 지운다.
  8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
  9. 자기 자신을 제외한 7의 배수를 모두 지운다.
  10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.

https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 수학에서 에라토스테네스의 체는 소수(소쑤)를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색) 자기 자신을 제외한 2의 배수를 모두 지운다. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초

ko.wikipedia.org

프로젝트의 규모가 커질수록 속도가 중요하니 알고리즘과 수학쪽 과목도 다음 학기때 꼭 수강해야겠다.