두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
def solution(left, right):
answer = 0
cnt = 0
for i in range(left, right+1):
for j in range(1, i+1):
if i % j == 0:
cnt += 1
if cnt % 2 == 0:
answer += i
else :
answer -= i
return answer
def solution(left, right):
answer = 0
for i in range(left, right+1):
cnt = 0
for j in range(1, i+1):
if i % j == 0:
cnt += 1
if cnt % 2 == 0:
answer += i
else :
answer -= i
return answer
첫 번째 코드에서는 cnt 변수가 solution 함수 시작 부분에 정의되어 있었지만, for문 외부에서 초기화되고 있다. 따라서 반복문이 끝난 후에도 cnt 값은 전체 범위에서 누적되어 계산된다.
두 번째 코드에서는 cnt 변수가 함수 내부의 for문 안에서 초기화되고 있어, 각 반복문이 수행된 후 cnt의 값이 초기화되어 i에 대한 약수 개수를 개별로 구할 수 있다.
변수를 먼저 정의해놓는 것이 가독성이 좋을 것이라 생각해 cnt 변수를 정의할 때 answer 변수와 함께 적었는데, 변수의 위치에 따라 결과값이 다를 수 있다는 것을 알게 되었다.
def find_divisor(num):
count = 0
for i in range(1, num+1):
if num%i==0:
count += 1
# 짝수이면 1
if count%2 == 0:
return 1
# 홀수이면 0
else:
return 0
def solution(left, right):
ans = 0
for i in range(left,right+1):
if find_divisor(i) == 0:
ans-=i
else:
ans+=i
return ans
문제에서 주어진 답안부터 시작하지 않고, 이전에 약수를 구하는 함수를 먼저 만들어 이용했다.