코딩테스트

[코딩테스트] 약수의 개수와 덧셈

이경욱 2023. 12. 22. 10:46

문제

 

두 정수 left와 right가 매개변수로 주어집니다.

 

left 부터 right 까지의 모든 수들 중에서,

 

약수의 개수가 짝수인 수는 더하고, 

 

약수의 개수가 홀수인 수는 뺀 수를

 

return 하도록 solution 함수를 완성해주세요.

 

 

 

 

해결

function solution (left, right) {
    const arr = []
    return Array
    .from({length : (right - left) + 1}, (_, i) => left + i)
    .map((item, i) => {
        const length = []
        arr.push(item)
        for (let i = 0; i <= item; i++) {
            if (item % i === 0) {
                length.push(i)
            }
        }
        return length.length;
    })
    .reduce((acc, cur, i) => cur % 2 ? acc - arr[i] : acc + arr[i], 0)
}

 

 

다른 사람의 풀이를 보니 굉장히 어렵게 푼 것 같다. . .

 

 

 

우선 Array.from으로 left와 right 사이의 수를 배열로 만들고

 

해당 배열을 map 함수를 통해 

 

함수 내부에서 for 문으로 약수를 구해주었다.

 

 

 

마지막 reduce 메서드로 홀수인지 짝수인지 삼항연산자로 분류하여 계산해주었다.

 

 

 

 

 

다른 사람의 풀이

function solution2 (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;
}

 

 

'제곱근이 정수면 약수의 개수가 홀수다'

 

isInteger를 통해 정수를 구분하는 true, false를 반환하고

 

조건문으로 answer를 계산하였다.

 

 

 

function solution3 (left, right) {
  let answer = 0;

  for (let i = left; i <= right; i++) {
    let count = 0;
    for (let j = 1; j <= i; j++) {
      if (i % j === 0) count++;
    }
    if (count % 2) answer -= i;
    else answer += i;
  }

  return answer;
}

 

 

2중 for문으로 계산한 방법이다.