티스토리 뷰

Algorithm/Programmers

약수의 합

Liiot 2020. 2. 8. 21:46

1. 문제

문제 설명

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

제한 사항

  • n은 0 이상 3000이하인 정수입니다.

입출력 예

n return
12 28
5 6

입출력 예 설명

입출력 예 #1
12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.

입출력 예 #2
5의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.

 

2. 풀이 과정

def solution(n):  
    if n == 0 or n == 1:
        return n

    factor  = set()
    for i in range(1, ((n // 2) + 1)):
        if (n % i) == 0:
            factor.update([i, (n // i)])
    return sum(factor)

예를 들어, n = 28인 경우, 14까지만 반복되고 1 - 28, 2 - 14, ... 식으로 묶어서 factor에 들어간다.

 

다만, 4 - 7 와 7 - 4 는 같기 때문에 애초에 factor를 리스트가 아닌 중복은 제거되는 집합으로 정의하였다.

 

3. 다른 사람의 풀이

def sumDivisor(num):

    return num + sum([i for i in range(1, (num // 2) + 1) if num % i == 0])

역시 한 줄의 미학...!

 

num / 2 의 수들만 검사하면 되는 것은 캐치했지만 자기 자신을 나중에 따로 더해주면 코드가 더 깔끔해질 수 있었다.

 

자기 자신을 따로 나중에 따로 더해준다면 내가 푼 방법처럼 약수를 짝지어 factor에 추가하지 않아도 되었다.

 

여러모로 아쉬웠던 문제

'Algorithm > Programmers' 카테고리의 다른 글

2016년  (0) 2020.02.14
두 정수 사이의 합  (0) 2020.02.14
문자열을 정수로 바꾸기  (0) 2020.02.08
서울에서 김서방 찾기  (0) 2020.02.04
짝수와 홀수  (0) 2020.02.04
댓글