본문 바로가기

Code Kata/[Python] Code Kata

[Python] 프로그래머스 Lv.1 약수의 개수와 덧셈

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

 

left부터 right까지의 모든 수(num)를 반복문으로 하나씩 불러오고

조건문을 사용해 약수의 개수(len)가 짝수이면 answer 변수에 더해주고 아니라면 빼주었다.

def solution(left, right):
    answer = 0
    for num in range(left, right+1):
        if len([i for i in range(1, num+1) if num%i==0])%2==0:
            answer += num
        else:
            answer -= num
    return answer

 

약수를 구하는 반복문과 조건문, 약수의 개수를 구하는 조건문과 반복문

이렇게 반복문과 조건문이 2번씩 들어가서인지 실행 시간이 효율적이지 못한 코드라서

다른 사람의 답을 봤더니 제곱수의 약수는 홀수개라는 점을 사용해 풀이한 코드가 있었다.

아래와 같은 코드로 채점했더니 실행 시간이 훨씬 단축된 것이 확인되었다.

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

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

 

사실 제곱수의 약수가 홀수개라는 말이 이해가 안 되어서 직접 파이썬으로 출력해 봤다.

예를 들어 주어진 수가 4일 경우 4의 약수는 1, 2, 4로 총 3개 홀수이다.

2처럼 같은 수끼리 곱해져서 n이 되는 제곱수는 약수의 개수가 홀수개가 될 수밖에 없는 것이었다.

간단한 수학적 지식일지는 몰라도 수학에서 손을 놓은 지 한참 된지라 새삼스럽게 배운 지식이다 :)

n=4
print(int(n**0.5))
print(n**0.5)

## 2
## 2.0
n=5
print(int(n**0.5))
print(n**0.5)

## 2
## 2.23606797749979