본문 바로가기
코테

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

by 해룸 2024. 1. 25.

문제

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

  • 1 ≤ left  right ≤ 1,000
left right result
13 17 43
24 27 52

 

문제풀이

1. 약수의 개수 구하기

function aa(num){
  let sum = 0
  for(let i =0; i<= num; i++){
      if(num % i === 0){
          sum +=1
      }
  }
    return sum
}

2. left에서 right 까지의 수

3. 약수의 개수가 짝수면 더하기, 홀수면 빼기

function solution(left, right) {
    var answer = 0;
    for(let i=left;i<=right;i++){
        console.log(aa(i))
        if(aa(i)%2 === 0){
            answer += i
        }else{
            answer -= i
        }
    }
    return answer;
}

 

문제를 풀며 겪은 오류

항상 초기에 주어지는 solution 함수안에서만 풀다보니 새롭게 함수를 만들어도 된다는 생각이 나질 않았다. 아무리 해봐도 저 함수 안에서 조건을 만족하기 쉽지않아서 solution 변수값을 바꿔보면 어떨까? 하는 생각도 했지만 어떻게 구현해야할지 어려웠다. 다른 풀이를 참조해 이런 방식으로 풀게 되었으며 다음에 또 비슷한 경우를 겪는다면 새로운 함수를 만드는 법도 쉽게 떠올릴 수 있을것 같다. 자바스크립트야.. 친해지자 우리!

 

다른풀이

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;
}

 

이 풀이는 약수의 개수는 기본적으로 짝수인데, 어떤 수의 제곱인 경우에만 약수의 개수가 홀수임을 이용하여 풀어준 것이다. 약수는 원래 나누어 떨어지는 수이므로 각각 곱해서 원래 수가 되는 짝이 있다. 하지만 제곱수인 경우는 자기 자신을 두 번 곱하기 때문에 약수가 홀수가 되는 것이다.

 

예를 들어 16의 경우, 약수는 [1,2,4,8,16]인데, [1,16], [2,8]은 각각 곱하면 16이 되는 짝이다. 4같은 경우는 4 스스로를 다시 곱해야 16이 되므로 짝이 없게 된다. 그래서 결국 제곱수는 홀수개의 약수를 갖게 된다.

 

따라서 숫자가 제곱수인지 판별을 하면 약수가 짝수인지 홀수인지 알 수 있다. math.sqrt()함수는 루트를 씌워주는 함수인데, 루트를 씌운 다음 Number.isInteger()으로 정수인지 확인한다면 제곱수는 true, 나머지는 false를 인출할 것이다. 따라서 true라면 -i로, false라면 i로 만들어 주면 된다.

 

참고블로그: https://velog.io/@ge-um/%EC%95%BD%EC%88%98%EC%9D%98-%EA%B0%9C%EC%88%98%EC%99%80-%EB%8D%A7%EC%85%88

 

수학적 사고가 부족해서 나에게 너무 서운하다..