[파이썬 코딩테스트] 약수의 개수와 덧셈

ch.2·2024년 7월 8일
0

코딩 테스트

목록 보기
7/21
post-thumbnail

문제

두 정수 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
  • left 부터 right 까지의 숫자를 구하는 for문을 작성한다. (변수: i)
  • 각 숫자의 약수를 구하는 for문을 작성한다. (변수: j)
  • j의 약수를 담는 변수를 cnt라고 설정하여, 함수 정의문(def) 아래 변수 설정 구간에 cnt 변수를 작성했다.
  • j의 약수를 cnt에 담고, cnt가 짝수인지 홀수인지 판별하는 if문을 작성했다.


두 번째 시도

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 변수의 위치를 첫 번째 for문 아래로 바꾸었다.


알게 된 것

첫 번째 코드에서는 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

문제에서 주어진 답안부터 시작하지 않고, 이전에 약수를 구하는 함수를 먼저 만들어 이용했다.

profile
데이터 분석 공부중

0개의 댓글