# 파이썬 약수의 개수 구하기(제곱근, 루트)

주어진 숫자의 약수가 짝수면 + 홀수면 - 하는 문제에서 나는 약수를 구하는데 굉장히 원초적인 방법을 사용했다.

k_lst = []
    for k in range(1,n+1):
        if n % k == 0:
            k_lst.append(k)
    # print(len(k_lst))
    if len(k_lst) % 2 == 0:
        result = 'even'
    else:
        result = 'odd'

이렇게 주어진 숫자를 1부터 한번씩 다 대입해서 약수들을 리스트로 만들고 더한 값이 홀수 인지 짝수인지 판단하는 것이다.

실제 문제는 left와 right 두 숫자가 주어져 그 사이의 숫자들을 구하고 약수의 개수에 따라 +,-를 부여해 합산하는 것이기에 반복문을 4번이나 돈 것이다.

다른 사람들의 풀이를 보니 약수의 특징을_ 이용해 _더 쉽게 문제를 풀 수 있었다.
약수가 홀수인 숫자는 루트했을때 정수인 특징이 있다.

예를 들어, 16은 1, 2, 4, 8, 16으로 총 5개의 약수를 가지는데 16의 루트는 4이다.
반대로 12는 1, 2, 3, 4, 6, 12로 총6개의 약수를 가지는데 12의 루트는 3.4641...이다.

이처럼 주어진 숫자에 루트를 씌워 나온 값이 정수이면 그 숫자의 약수는 홀수이고 정수가 아니라면 그 숫자의 약수는 짝수인 것이다.

코드로 작성하면 이렇게 된다.

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

left부터 right까지 숫자를 구한다음 그 숫자들을 반복문을 통해 약수의 개수가 홀수인지 짝수인지 구분하고 더하기 빼기를 진행한다.

파이썬에서 루트는 n**0.5 혹은 n**(1/2)를 사용하거나 math 모듈에서 sqrt를 사용한다.
math.sqrt(n) sqrt는 square root의 약자다.

내가 작성한 코드에 비하면 너무나 효율적이다.

내가 작성한 코드:

def solution(left, right):
    lst = [i for i in range(left , right+1)]
    even_lst = []
    odd_lst = []
    for j in lst:
        result = even_or_odd(j)
        if result == 'even':
            even_lst.append(j)
        else:
            odd_lst.append(j)
    return sum(even_lst) - sum(odd_lst)

def even_or_odd(n):
    k_lst = []
    for k in range(1,n+1):
        if n % k == 0:
            k_lst.append(k)
    # print(len(k_lst))
    if len(k_lst) % 2 == 0:
        result = 'even'
    else:
        result = 'odd'

    return result

For the site tree, see the [root Markdown](https://slashpage.com/kyugntae-ai.md).
