약수의 개수와 덧셈(level1)

원용현·2022년 8월 23일
0

프로그래머스

목록 보기
7/49

링크

https://school.programmers.co.kr/learn/courses/30/lessons/77884

문제

두 정수가 매개 변수로 주어질 때, 두 숫자 사이의 모든 수에 대해 약수의 개수가 짝수라면 +, 약수의 개수가 홀수라면 -를 진행한 결과를 반환하라.

예제로 이해

두 매개 변수 13과 17이 주어질 때 나올 수 있는 숫자들의 약수의 개수는 다음과 같다.

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개

따라서 짝수 개는 더하고 홀수 개는 뺀 결과는 13 + 14 + 15 - 16 + 17 = 43 이다.

위와 같이 정석적으로 약수의 개수를 구해서 짝수개인지 홀수개인지를 판별하는 방법도 있지만 좀 더 간단하게 판별하는 방법은 제곱근의 값을 알아보는 것이다.

약수는 어떤 수와 어떤 수의 곱으로 짝을 이루어서 구성되기 때문에 일반적으로는 하나가 나오면 다른 하나는 자동적으로 결정되기 때문에 짝수개를 이룬다. 하지만, 한 가지 경우에 대해서는 짝을 이루지 않는데 그 경우가 바로 제곱근의 값이 정수일 때 이다.

제곱근의 값이 정수라는 것은 제곱근을 2번 곱해서 자기 자신이 나오기 때문에 짝을 이루지 않아 이 경우에만 약수의 개수가 홀수가 나올 수 있다.

위의 예제의 경우 16에 대해서만 제곱근의 값이 4로 정수를 이루기 때문에 16만 홀수 개의 약수를 가진다.

코드

function solution(left, right) {
    let result = 0
    new Array(right - left + 1).fill(1).map((el,index) => {
        let num = Math.sqrt(left + index)
        
        if(num === parseInt(num)) result -= (left + index)
        else result += (left + index)
    })
        return result
}

코드 풀이

new Array(right - left + 1).fill(1).map((el,index) => 

새로운 배열을 만들어 map 함수를 돌리는데 배열 자체는 두 매개변수 사이의 개수만큼의 길이를 가지는 의미 없는 배열을 만들어준다.

let num = Math.sqrt(left + index)

Math.sqrt 함수를 사용해서 제곱근의 값을 구한다. 함수의 인자로 들어가는 값은 left + index 값을 넣어서 반복마다 index 값이 1씩 증가되어 두 숫자 사이의 모든 수에 대해서 반복이 이루어질 수 있도록 한다.

if(num === parseInt(num)) result -= (left + index)
else result += (left + index)

조건에 따라서 현재 판별 중인 숫자를 결과값에 더해줄지, 빼줄지를 결정한다. 구한 제곱근의 값에 대해서 parseInt()를 적용해서 소수점 아래의 숫자를 버렸을 때, 그 값이 원래의 값과 같은지 비교한다.

만약 같다면 그 숫자의 제곱근이 약수가 된다는 의미이므로 약수의 개수는 홀수개이므로 결과값에 -를 진행하고, 만약 다르다면 그 숫자의 제곱근이 약수가 아니라는 의미이므로 약수는 짝수개를 가지므로 결과값에 +를 진행한다.

마지막으로 계산된 결과를 return해서 문제를 마무리한다.

0개의 댓글