라떼는말이야

[프로그래머스 lv1] 약수의 개수와 덧셈 (파이썬) 본문

알고리즘/코딩 테스트

[프로그래머스 lv1] 약수의 개수와 덧셈 (파이썬)

MangBaam 2021. 6. 23. 17:00
반응형

문제 설명

두 정수 left right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ left  right ≤ 1,000

입출력 예

입출력 예

 

입출력 예 설명

입출력 예 #1

  • 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.

입출력 예#1

  • 따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.

입출력 예#2

  • 따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.

 

나의 풀이

def solution(left, right):
    answer = 0
    for i in range(left, right + 1):
        if isEven(i): answer += i
        else: answer -= i
    return answer

def isEven(num):
    return True if (num ** (1/2)) % 1 > 0 else False

이 문제의 관건은 약수의 개수가 홀수인지 짝수인지 판별하는 것이다.

 

가장 단순한 생각으로는 모든 약수를 구하는 것이 되겠다. 나도 처음에는 이 방식으로 시도했었다.

그러나 코드를 짜다 보니 재밌는 사실을 발견했다.

 

약수의 개수가 홀수인 경우는 제곱수인 경우 뿐이다.

 

약수는 항상 짝을 이룬다.

예를 들어 36의 약수는 [1, 2, 3, 4, 6, 9, 12, 18, 36] 인데 이는 다음과 같이 짝지어진다.

(1, 36), (2, 18), (3, 12), (4, 9), (6, 6)

그런데 제곱수의 경우 (6, 6)과 같이 같은 수의 곱으로 이루어지기 때문에 6은 약수로 한번만 세서 홀수 개가 된다.

 

isEven() 함수에서는 약수의 개수가 짝수인지 판별하는데 그 방법은 위에서 설명한 것과 같이 제곱근이 정수인지 확인 후 정수가 아니라면 True, 정수라면 False를 한다.

 

테스트 결과

반응형
Comments