약수의 개수와 덧셈

Creating the dots·2021년 10월 8일
0

Algorithm

목록 보기
22/65

프로그래머스

https://programmers.co.kr/learn/courses/30/lessons/77884

나의 풀이

약수의 개수를 구하는 함수(getDivisor)를 만들어서 left부터 right까지 함수에 대입해가며 sum 값을 구했다.
getDivisor함수는 1부터 Math.sqrt(num)까지만 확인했고, num/i===i인 경우 (ex. 9/3=3)를 제외하고

function solution(left, right) {
    //약수의 개수를 구하는 함수를 만든다
    //약수가 짝수개이면 더하고, 홀수개이면 뺀다
    
    let sum = 0;
    //약수의 개수를 구하는 함수
    const getDivisor = (num) => {
        const divisors = []; //약수배열
        for(let i=0;i<=Math.sqrt(num);i++){
            if(num%i===0){
                divisors.push(i);
                if(num/i===i) continue
                divisors.push(num/i);
            }
        }
        return divisors.length;
    }
    
    for(let i=left;i<=right;i++){
        if(getDivisor(i)%2===0) sum = sum + i;
        else{
            sum = sum - i;
        }
    } 
    return sum;    
}

다른 사람 풀이

이 풀이법은 약수의 개수를 구하는 함수를 만들지 않고 Number.isInteger((Math.sqrt(i))를 활용해 문제를 해결했다.
사용된 개념은 어떤 수의 제곱근이 정수이면 약수는 홀수개이고, 제곱근이 아니면 약수는 짝수개라는 것이다.

예를 들어, 16은 Number.isInteger(Math.sqrt(16))===true이고 약수는 1,2,4,8,16으로 5개이다. 반면 15는 Number.isInteger(Math.sqrt(15))===false이고 약수는 1,3,5,15로 4개이다.

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

앞서 만들었던 함수의 아래 부분과 연관해서 생각해보면 i(정수)가 num의 제곱근인 경우에는 i만 push되어 약수가 홀수개가 되고, i가 num의 제곱근인 경우가 없다면, i와 num/i 2개씩 push되어 약수가 짝수개가 된다.

for(let i=0;i<=Math.sqrt(num);i++){
  if(num%i===0){
    divisors.push(i);
    if(num/i===i) continue
    divisors.push(num/i);
  }
}
//이 부분에서 num/i===i인 경우는 배열에 i만 push되고, 
//그 외의 경우 i와 num/i모두 push된다
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글