[알고리즘] 약수의 합

DongGyu Jung·2021년 10월 23일
0
post-thumbnail

※ 본 사진과 해당 게시글 내용의 문제 모두 프로그래머스[Programmers]사이트에 발췌해왔습니다.


❓ 문제

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

제한 조건 : 
n은 0 이상 3000이하인 정수입니다.

<입출력 >
n	| return
12	| 28
5	| 6

❗ 풀이

My Code

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

아직 많은 알고리즘을 풀어보지도 못했지만
개인적으로 약수를 활용하는 유형이 적지 않게 보이는 것 같다.

어쨋든
원리만 알면 간단한 풀이였기 때문에 간략하게 원리만 적어보려 한다.
우선 약수의 특징은 "약수로 나누면 나머지가 0" 이라는 점이다.
너무 간단하다...(허탈)
range(1, n+1)로 입력값 범위의 연속적인 정수 범주를 생성해서 하나씩 나눠보는 것이다.
나머지가 0일 때만 그대로 가져오고,
0이 아닐 땐 0으로 가져오게끔 설계했다.

아직 리스트 컴프리헨션을 잘 사용하지 못하는 탓에
나머지가 0인 값들만 가져오게 하는게 바람직하지만
else는 0으로 가져오게 하는 실수(?)를 범했다.

그렇게 가져온 값들의 합(sum())을 반환한다.


❣ 다른 풀이

(1)

def sumDivisor(num):
    # num / 2 의 수들만 검사하면 성능 약 2배 향상잼
    return num + sum([i for i in range(1, (num // 2) + 1) if num % i == 0])

주석은 유쾌해서 지우지 않았습니다...ㅎ(재미없나요...)😏
약수를 구하는 방법은 동일하나 센스가 돋보이는 풀이였다.
약수의 특성상 모든 자연수의 약수는 1과 자기 자신이다.
이 후, 1보다 큰 2 혹은 2보다 큰 수가 나오는 순간!
짝지어지는 값은 자기 자신의 반값 이하일 수 밖에 없다.

이 점을 활용해서 범주를 range(1, (num // 2)+1) ( 1부터 [입력값 / 2]의 까지 )로 주어서
범주를 절반으로 줄임으로서 처리할 값들의 개수를 절반으로 줄여 처리속도(성능)을 높였다!!
return할 땐, 잊지 않고 자기 자신을 더해주어야 한다.


0개의 댓글