본문 바로가기
IT/Algorithm Study

[프로그래머스] 약수의 갯수와 덧셈

by 천빈 2021. 5. 19.
 

코딩테스트 연습 - 약수의 개수와 덧셈

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

programmers.co.kr

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


제한사항

  • 1 ≤ left  right ≤ 1,000

입출력 예

leftrightresult

13 17 43
24 27 52

 

import math
def solution(left, right):
    answer = 0
    for i in range(left,right+1):
        sqrt = math.sqrt(i)
        answer = answer - i if int(sqrt) == sqrt else answer + i
    print(answer)
    return answer

풀이

이 문제는 보기를 통해 나름 조건은 쉽게 찾아내었다.

13 ~ 17의 예에서 16의 약수가 홀수개이고,

13 1, 13 2
14 1, 2, 7, 14 4
15 1, 3, 5, 15 4
16 1, 2, 4, 8, 16 5
17 1, 17 2

24 ~ 27의 예에서 25의 약수가 홀수개이다.

24 1, 2, 3, 4, 6, 8, 12, 24 8
25 1, 5, 25 3
26 1, 2, 13, 26 4
27 1, 3, 9, 27 4

이 것을 보고 4 * 4 / 5 * 5는 물론이고, 6 * 6/7 * 7 등의 약수 역시 홀수개인 것을 알 수 있었다.

즉 N의 제곱의 약수는 1, N, N의 1/2제곱인 것을 알 수 있었다.

N의 1/2제곱을 구하기 위해 전에 알아봤던 math 라이브러리를 사용하였다.

 

[프로그래머스] 정수 제곱근 판별

코딩테스트 연습 - 정수 제곱근 판별 | 프로그래머스 (programmers.co.kr) 코딩테스트 연습 - 정수 제곱근 판별 임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n

dkdlskan.tistory.com

 

 

math.sqrt(i)는 i의 1/2승, 제곱근을 나타낸다.

 

 answer = answer - i if int(sqrt) == sqrt else answer + i

N의 제곱이 아닌이상 sqrt는 무조건 소수점이 뜰 것이고,

N의 제곱이라면 sqrt는 무조건 N의 값이 나올것이다. 

즉 sqrt와 sqrt의 정수부만을 보여주는 int(sqrt)가 같다면 그 수는 N의 제곱일 것이고, 문제의 조건에 따라 answer - i로 값을 받아준다.

 

    for i in range(left,right+1):
        sqrt = math.sqrt(i)
        print("{}의 제곱근 값은 : {}, 정수부는 {}".format(i,sqrt,int(sqrt)))
        answer = answer - i if int(sqrt) == sqrt else answer + i
        print("정답 :", answer)
    print(answer)
13의 제곱근 값은 : 3.605551275463989, 정수부는 3
정답 : 13
14의 제곱근 값은 : 3.7416573867739413, 정수부는 3
정답 : 27
15의 제곱근 값은 : 3.872983346207417, 정수부는 3
정답 : 42
16의 제곱근 값은 : 4.0, 정수부는 4
정답 : 26
17의 제곱근 값은 : 4.123105625617661, 정수부는 4
정답 : 43

16의 sqrt = int(sqrt)가 같으므로 값을 뺴고, 나머진 더해주어서 정답출력