얼렁뚱땅 스며드는 Data Science

Algorithm/Daily Coding Tests Challenge

[프로그래머스 코딩테스트] lv1. 약수의 개수와 덧셈

Jesip14 2021. 7. 30. 14:37

문제 설명

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

 

나의 풀이

def divisors(num):
    div_list = [1]
    for i in range(2, num + 1):
        if num % i == 0:
            div_list.append(i)
    
    return 1 if len(div_list) % 2 == 0 else -1

def solution(left, right):
    return sum([divisors(i) * i for i in range(left, right + 1)])

이전 소수의 문제와 같이 2부터 num까지 나눠가면서 코드를 짰더니 시간이 오래걸렸습니다. 여기서 새로운 수학 지식이 등장하는데요, 약수의 개수가 홀수일 경우에는 해당 숫자가 제곱수여야합니다! 새삼 어렸을 때 배웠던 지식들을 다시 꺼내야 하는 걸 알게 됐네요...

이러한 방식으로 코드를 짜면 더욱 더 빠르게 결과를 얻을 수 있습니다. 코드는 다음과 같습니다.

def divisors(num):
    return -num if num % (num ** 0.5) == 0 else num
    
def solution(left, right):
    return sum([divisors(i) for i in range(left, right + 1)])

 

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/77884