[프로그래머스] 코딩테스트 연습 - 약수의 개수와 덧셈

김예림·2021년 11월 9일
0

스스로 풀어보려다가 도저히 모르겠어서 구글링해서 겨우 풀었다. 약수를 조건적으로 구하는게 너무 어려웠다.
조금 더 수학적 지식이 필요한 것 같다.

제시된 문제는



제한사항을 통해 left가 right보다 작다는 것을 알 수 있다.

풀이 1

function solution(left, right) {
    var answer = 0;
    for (let i = left; i <= right; i++){
        let arr = [];
        for (let j = 0; j <= i; j++) {
            if (i % j === 0) {
                arr.push(j)
            }
        }
        answer += arr.length % 2 === 0 ? i : -i;
    }
    return answer;
}

j를 0부터 1씩 증가하면서 if문을 통과하면 j가 i의 약수인지, 아닌지 판단할 수 있다.
j를 arr 배열에 하나씩 추가하면 arr에는 약수들로 구성되는데
약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 빼야하므로 마지막
arr.length % 2 를 통해 약수의 홀짝을 판별한 뒤, answer에 더해주면 된다.

풀이 2

function solution(left, right) {
    var answer = 0;
    for (let i = left; i <= right; i++) {
        if(Number.isInteger(Math.sqrt(i))){
            answer -= i
        } else {
            answer += i
        }
    }
    return answer;
}
이건 사람들의 극찬?을 받았던 풀이인데
Math.sqrt() 함수는 제곱근을 반환하는 함수다.
Number.isInteger() 함수는 정수인지, 아닌지 판단하는 함수이다.

제곱근이 정수이면, 약수의 개수가 홀수라는 것이라고 한다.
따라서 if문은 제곱근의 정수 여부에 따라 answer에 값을 바로 더해주고 빼주고 한 것이다.

수학적 지식도 물론이지만, 이 문제를 통해, 함수도 더 배울 수 있었다.

profile
초보개발자

0개의 댓글