162일차(1) - 약수의 개수와 덧셈(프로그래머스)

김민찬·2021년 10월 17일
0

취업으로의 여정

목록 보기
165/196

약수의 개수와 덧셈

프로그래머스: 약수의 개수와 덧셈

문제: 두 정수 leftright가 매개변수로 주어질때, left에서 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성하시오.

입출력 예

leftrightresult
131743
242752

문제 해석

숫자 하나하나의 약수들을 전부 찾아보면서 그 숫자를 세기는 너무 비효율적이라고 생각했다.
그래서 일정한 패턴을 찾아보기로 했다.

대부분의 정수의 약수의 개수는 짝수이다. 하지만, 약수의 개수가 홀수인 경우가 있다.
바로, 그 정수의 제곱근이 정수일 때이다.
그러므로 보통의 경우에는 더하고, 제곱근이 정수인 수는 빼주면 된다.

나의 풀이

function solution(left, right) {
    let result = 0;
    // 두 정수 사이의 수들을 더하고 빼줄 result라는 변수를 생성한다.
  
    for (let i = left; i <= right; i++) {
    // left부터 right까지 모든 수를 살펴본다.
        if (Math.sqrt(i) === parseInt(Math.sqrt(i))) {
        // 사이의 수 중에서 제곱근이 정수일때는 약수의 개수가 홀수이다.
            result -= i;
            // 약수의 개수가 홀수이면 result에서 그 수만큼 빼준다.
        } else {
            result += i;
            // 그렇지 않은 경우는 약수의 개수가 짝수이므로 result에게 더해준다.
        }
    }    
    
    return result;
    // 결과를 리턴한다.
}

알게된 것

풀이에서 작성한 Math.sqrt(i) === parseInt(Math.sqrt(i))보다 정수인지 확인하는 더 좋은 함수를 알게 되었다.

Number.isInteger(value)

value가 정수인지 확인할 수 있고, 반환값으로 Boolean값을 준다.
이를 사용해서 식을 바꿔보면 아래와 같이 바꿀 수 있다.

function solution(left, right) {
    let result = 0;
    
    for (let i = left; i <= right; i++) {
        if (Number.isInteger(Math.sqrt(i))) {
        // 이 부분만 변경하였다.
            result -= i;
        } else {
            result += i;
        }
    }    
    
    return result;
}
profile
두려움 없이

0개의 댓글