본문 바로가기

Computer Science/Algorithms

[python] 프로그래머스 - 약수의 합 (효율적으로 풀기)


나의 풀이

def solution(n):
    answer = 0
    for i in range(1,n+1):
        if n%i == 0:
            answer += i
    return answer

solution(12) #28

모범 답안 1

def sumDivisor(n):
    return sum([i for i in range(1,n+1) if n%i==0])

나와 같은 풀이인데, sum() 와 list comprehension으로 한 줄로 표현한게 멋지다.

 


모범 답안 2

def sumDivisor(n):
    return n + sum([i for i in range(1, (n // 2) + 1) if n % i == 0])

위 풀이는 정말 흥미로운 풀이인 것 같다.
전부 다 나누어 확인하는 것이 아닌 num / 2 의 수들만 검사하는 것으로, 성능을 약 2배 향상시킬 수 있다.

  • n = 12일 경우

range(1,7)의 숫자들 1~6 만을 검사한다.
그러면 1,2,3,4,6 + 12 = 28이다.

  • n = 32일 경우
    range(1,17)의 숫자들 1~16 만을 검사한다.
    그러면 1,2,4,8,16 + 32 = 63이다.