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에 추가하지 않아도 되었다.
여러모로 아쉬웠던 문제