Programmers Coding Quiz #43 약수의 개수와 덧셈

김기욱·2022년 1월 26일
0

코딩테스트

목록 보기
61/68
post-custom-banner

문제 설명

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

제한사항

  • 1 ≤ left ≤ right ≤ 1,000

입출력 예제

leftrightresult
131743
242751

풀이

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문으로 연산처리해버리는 깔끔한 풀이법이네요. 약수의 개수가 홀수인 모든 수는 제곱수 잊지 않아야 겠습니다.

profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.
post-custom-banner

0개의 댓글