PS/프로그래머스

약수의 개수와 덧셈 (lv1)

ForteQook 2022. 7. 4. 13:14

 주어진 두 수 사이의 값들이 약수를 홀수개로 갖는지 짝수개로 갖는지 판단하는 문제이다. 따라서 먼저 약수의 개수를 구하고, 그 값이 짝수 인지 홀수 인지 판별하는 식으로 접근했다.

 그러나 수학적으로 다음과 같은 명제가 존재한다.

약수(수학) - 나무위키 (namu.wiki)

 

약수(수학) - 나무위키

6, 10, 12, 14, 15, 18, 20, 21, 22, 24, 26, 28, 33, 34, 35, 36, 38, 39, 40, 44, 45, 46, 48, 50, 51, 52, 54, 55, 56, 57, 58, 62, 63, 65, 68, 69, 72, 74, 75, 76, 77, 80, 82, 85, 86, 87, 88, 91, 92, 93, 94, 95, 96, 98, 99, 100 (56개)

namu.wiki

제곱수의 약수의 개수는 홀수이고, 제곱수가 아닌 경우는 짝수이다.

 또한, 다음과 같은 명제도 존재한다.

[노트] 모든 약수를 구하는 알고리즘은 O(sqrt(n))이다. (tistory.com)

 

[노트] 모든 약수를 구하는 알고리즘은 O(sqrt(n))이다.

학원 학생들이 약수를 모두 찾는 (또는 약수의 합, 개수를 구하거나, 소수 판별 등등) 코드를 어떻게 짜는지 살펴보면, 백이면 백 \(O(n)\) 알고리즘을 사용한다. 하지만 어떤 수의 모든 약수를 구

doodle-ns.tistory.com

 약수를 구하는 알고리즘을 작성할 때, n의 약수 d는 i 번째와 마지막에서 i번째 끼리 값이 같기 때문에, 제곱근까지만 연산하면 된다. 즉, 제곱근에 대해서 약수들은 대칭관계를 갖는다는 점을 유의하자는 것이다.

 

 본 문제를 해결하기 위해 두 명제가 모두 필요한 것은 아니지만, 첫번째 명제를 이용해 간단히 어떤 수가 홀수개의 약수를 갖는지, 짝수개의 약수를 갖는지 알아볼 수 있다.


코드

before

def solution(left, right):
    answer = 0
    for d in range(left,right+1):
        if d == 1:
            answer -= 1
            continue

        cnt = 2
        for divisor in range(2,d//2+1):
            if d % divisor == 0:
                cnt += 1
        if cnt % 2 == 0:
            answer += d
        else :
            answer -= d
    return answer

after

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

 

'PS > 프로그래머스' 카테고리의 다른 글

최소직사각형 (lv1)  (0) 2022.07.04
2016년 (lv1)  (0) 2022.07.04
3진법 뒤집기 (lv1)  (0) 2022.07.04
실패율 (lv1)  (0) 2022.07.04
체육복 (lv1)  (0) 2022.07.03