Algorithm/Programmers

[Programmers] 합성수 찾기

juyeong 2023. 2. 16. 13:42
반응형

Q. 약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.

Source: https://school.programmers.co.kr/learn/courses/30/lessons/120846

 

처음 직관적으로 생각한 방법은 n에서 소수의 개수를 빼는 것이었다

-> 전체를 순회하기보다 제곱근+1의 값까지 체크하여 소수여부를 판별한뒤 (성능,속도면에서 전체를 체크하는 것보다 제곱근까지만 체크하는 것이 빠르기 때문) 

-> 전체개수에서 소수의 개수를 빼서 리턴하자 

import math 

def solution(n):
    isPrime = 0
    for i in range (1, int(math.sqrt(n)) +1):
        if n % i != 0:
            isPrime += 1
    return n-isPrime

당연히.. n에서 소수의 개수를 빼는 것이기 때문에 오답이었다. 

 

그래서 이렇게 작성했다. 제곱근은 math 라이브러리를 사용해도 된다. 근데 이 방법은 이중 for문 사용이라 더 좋은 방법이 있으면 좋겠다는 생각이다

def solution(n):
    answer = 0
    for i in range(4, n + 1): #1,2,3은 소수이기에 4부터 시작 
        for j in range(2, int(i ** 0.5) + 1): 
            if i % j == 0:
                output += 1
                break
    return answer

 

 

 

반응형