이 글은 제가 공부하며 기억하기 위해 기록하는 글입니다.
너무 쉬운 문제이지만, 항상 정석대로 코드를 작성하는 저의 코드와 다른 사람의 코드 비교는 최적화된 코드를 작성하는데 큰 도움이 됩니다.
이 글 또한 프로그래머스의 Level 1 '약수의 합' 문제를 풀고 다른 사람의 풀이와 비교하며 간단하게 깨닫게 된 시간을 절약할 수 있는 풀이 방법을 정리한 내용입니다.
나의 풀이
def solution(n):
answer = 0
for i in range(1,n+1):
if (n%i==0):
answer+=i
return answer
다른 사람의 풀이
def sumDivisor(num):
return num + sum([i for i in range(1, (num // 2) + 1) if num % i == 0])
차이점
n의 약수를 구하는 방법을 우리는 아주 잘 알고 있습니다.
1~n까지의 수 중, n을 어떤 수로 나누었을 때 나누어떨어지면 그 수가 바로 n의 약수입니다.
즉, n = 12인 경우, 1,2,3,4,6,12가 12의 약수입니다.
쉬운 문제이기 때문에 아는 그대로 작성하게 되면 저의 풀이처럼 코드를 작성하게 될 것입니다.
하지만, 다른 사람의 풀이를 참고해보면 아주 단순한 규칙만으로 풀이 시간 성능을 2배 향상시킬 수 있다는 것을 알 수 있습니다.
1*12=12
2*6=12
3*4=12
어떤가요?
n=40
1 40
2 20
4 10
5 8
즉, n / 2 내의 수에 대해서만 찾으면 된다는 것을 알 수 있습니다. 그 뒤는 볼 필요가 없습니다. 이미 n / 2는 n의 약수로 나올 수 있는 수 중 가장 큰 수 입니다.
여기까지 정리하겠습니다.