갱스터하우스

[Python] Lv1. 소수 찾기 본문

코테 문제/프로그래머스

[Python] Lv1. 소수 찾기

승갱 2022. 4. 12. 22:31

https://programmers.co.kr/learn/courses/30/lessons/12921

 

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

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

programmers.co.kr

 

 

 

 

 

문제 설명

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

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.

(1은 소수가 아닙니다.)

 

제한 조건

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

 

나의 접근 방법 및 풀이

가장 먼저 생각했던 방법은 for() 문을 이용해서 2부터 해당 숫자까지 나눠지는 지를 확인하는 방법이었다.

일부 테스트결과에서 시간 초과가 발생해서 다른 방법을 물색했다.

(1) 시간 초과

def solution(n):
    count = 0
    for num in range(2, n+1):
        for i in range(2, n)):
            if num%i == 0:
                break
        else:
            count+=1
             
    return count

 

(2) 성공

소수를 판별하는 방법에는 그 수가 다른 수로 나누어지는지, 즉 1과 자기 자신을 제외한 수중 약수가 존재하는지 확인하는 것이다. 그리고 그 약수를 보면 그 수의 제곱근, 즉 절반을 기준으로 약수들이 대칭인 점을 확인할 수 있다.

이점을 이용하여 소수를 판별할때 n까지가 아니라, n의 제곱근까지 나누는 것이다!(그러면 해야할 연산의 양도 줄어든다.)

def solution(n):
    count = 0
    for num in range(2, n+1):
        for i in range(2, int(num**0.5)+1):
            if num%i == 0:
                break
        else:
            count+=1
             
    return count

 

 

 

다른 풀이

2부터 n까지(n+1을 해야 포함) 집합 num를 생성한다.

for()문을 이용해서 2부터 n까지 반복해, 만약 i가 집합 num에 있다면 i의 배수들은 a에서 제외한다.

그리고 for()문이 종료되면 len(num)을 반환한다.

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)

이 방법을 통해 풀었을 경우, 엄청 상승한 것을 확인할 수 있다.