두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
left | right | result |
---|---|---|
13 | 17 | 43 |
24 | 27 | 51 |
def solution(left, right):
answer = 0
for n in range(left, right+1):
divisor_list = []
# 파라미터 n의 약수 구하기 n의 제곱근(반절)까지만 for loop
# 약수는 어짜피 pair가 있음 12의 약수 3,4나 2,6 1,12 모두 짝이 있음
for i in range(1, int(n**(1/2)) + 1):
# n을 i로 나눈 나머지가 0이면 약수
if (n % i == 0):
divisor_list.append(i)
# i의 제곱수가 n이 아닌 경우 n의 나머지도 더해줌
# pair가 아니라 제곱수로 약수가 되는 경우 중복제거를 위함 ex)9의 약수 3
if ( (i**2) != n) :
divisor_list.append(n // i)
# 약수의 개수가 짝수면 양수를 홀수면 음수를 answer에 더함
answer += n if len(divisor_list) % 2 == 0 else -n
# 최종합산된 answer 리턴
return answer
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
가장 많은 추천수를 받은 해결방식입니다.
수학적 이해도가 필요해보입니다. 약수의 개수가 홀수인 모든 수는 제곱수라는 수학적 법칙에 근거해 풀이를 해갑니다. 제곱수의 유무만 판별하면 되므로 제곱수의 유무만 if문으로 걸러주면서 그대로 for문으로 연산처리해버리는 깔끔한 풀이법이네요. 약수의 개수가 홀수인 모든 수는 제곱수 잊지 않아야 겠습니다.