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

나의 풀이

def solution(n):
    a = [0] * (n + 1)
    for i in range(2, len(a)):
        for j in range(2, len(a)):
            idx = i * j
            if idx > n:
                break
            a[idx] = 1
    return a[2:].count(0)
  • 처음 그냥 이중 for문을 이용하면 답은 맞지만, 시간 효율성 측면에서 실패하게된다.
  • 에라토스테너스의 체를 사용한다.
  • 에라토스테너스의 체는 소수의 배수는 소수가 아니라는 규칙이다.
  • 우선 값이 0인 배열을 입력값 + 1 만큼 사이즈로 만들어준다.
  • 배열은 인덱스를 0부터 세기 때문에, 인덱스 10을 사용하기 위해서는 하나 더 큰 11사이즈로 만들어 줘야 하기 때문이다.
  • 그리고 반복문을 돌린다.
  • 2부터 시작해서 n + 1 까지 각 수의 1의 배수를 제외한 배수의 인덱스의 값을 1로 바꿔준다.
  • 배수가 입력값을 넘어가면 반복을 종료한다.
  • 그렇게 하면 각 수의 배수의 인덱스는 1이되고 소수 인덱스의 값은 0이 남게 된다.
  • 배열의 인덱스 2부터 값이 0인 갯수를 반환하면 된다.

느낀점

예전에 자바로 풀었었는데, 그 사이에 에라토스테너스의 체를 까먹어버렸다.

0개의 댓글