본문 바로가기
내일배움 과제/기타 과제

알고리즘 33번 - 약수의 개수와 덧셈

by GREEN나무 2024. 12. 12.
728x90

 

 

 

JS

문제

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

제한사항
1 ≤ left ≤ right ≤ 1,000


계획

let answer = 0

for(let i =left ; i <= right; i++){

const n = 약수의 개수

(n%2)? answer -=i : answer +=i;

}

return answer

 


참고, 풀이

n의 약수 구하는 방법

1. 반복문으로 1 ~ n 사이의 값을 하나하나 대입해서 n을 나누기

const Divisors = (n) => {
    let arrD = [];
    for (let i = 1; i <= n; i++) {
        if (n % i === 0) arrD.push(i);
    }
    return arrD;
};

 

2. 주어진 수의 절반을 대상으로 약수 구하기

약수는 본인을 제외하고 n/2 보다 클 수 없기 때문에 절반값까지만 체크

const Divisors = (n) => {
    let arrD = [];
    for (let i = 1; i <= n/2; i++) {
        if (n % i === 0) arrD.push(i);
    }
    return [...arrD, n];
};

 

3. 제곱근(Math.sqrrt) 사용하기

해당 약수를 가지고 입력받은 값을 나누게 될 경우 나오는 결과 값 역시 약수

const Divisors2 = (n) => {
    let arrD = [];
    for (let i = 1; i <= Math.sqrt(n); i++) {
        if (n % i === 0) {
            arrD.push(i);
            if (n / i != i) arrD.push(n / i);
        }
    }
    arrD.sort((a, b) => a - b);
    return arrD;
};

console.log(Divisors2(102));
/*
[
   1,  2,  3,   6,
  17, 34, 51, 102
]
*/

 

 


답 - 3점나와서 별로 좋은코드는 아닌듯

function solution(left, right) {
    let answer = 0;
    for (let n = left; n <= right; n++) {
        let arrD = [];
        for (let i = 1; i <= Math.sqrt(n); i++) {
            if (n % i === 0) {
                arrD.push(i);
                if (n / i != i) arrD.push(n / i);
            }
        }
        arrD.length % 2 ? (answer -= n) : (answer += n);
    }
    return answer;
}

코드 간략화하기

function solution(left, right) {
    let result = 0;
    for (let i = left; i <= right; i++) result += Number.isInteger(Math.sqrt(i)) ? -i : i;
    return result;
}

참고

약수 구하기 : https://mine-it-record.tistory.com/522#google_vignette