Notice
Recent Posts
Recent Comments
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Today
Total
관리 메뉴

차차로그

[JS] 월간 코드 챌린지 시즌2 > 약수의 개수와 덧셈 본문

코딩테스트

[JS] 월간 코드 챌린지 시즌2 > 약수의 개수와 덧셈

차차한 2022. 8. 12. 16:57

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

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

function solution(left, right) {
    var answer = 0;
    var arr = [];

    arr[0] = left;

    for(var i = 1; i < right - left; i++){
        arr.push(left + i);
    }

    arr.push(right);

    var yak = [];

    for(var i = 0; i < arr.length; i++){
          var count = 0;
        for(var j = 1; j <= arr[i]; j++){
            if(arr[i] % j === 0){
                count++;  
            }
        }
        yak.push(count);
    }

    for(var i = 0; i < yak.length ; i++){
        if(yak[i] % 2 == 0){
            answer += arr[i];
        }else{
            answer -= arr[i];
        }
    }
    return answer;
}

오늘 푼 문제 중에 가장 복잡했던 문제..

먼저 배열에 left부터 right까지 수를 담고 , 다른 배열에 약수의 개수를 담았다.

그 후에 반복문을 이용해서 약수의 개수가 짝수/홀수일 때에 따라 값을 더하거나 빼줬다.

채점 결과는 통과이지만 뭔가 복잡해서 더 간단하게 줄이고 싶은 코드다.

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(x) : 주어진 숫자에 루트( )를 씌웁니다. 만약 숫자가 음수이면 NaN를 반환합니다.

-Number.isInteger(x) : 주어진 값이 정수인지 판별합니다.

해석해보면 반복을 돌려서 left부터 right까지 i로 받아 돌리고

i에 루트를 씌워서 Number.isInteger를 이용해 그 값이 정수면 true를 반환하는데, 제곱근이 정수면 무조건 약수의 개수는 홀수이기 때문에 answer -= i를 했다...

만약에 내가 Math.sqrt()를 알고 있었다 하더라도 이 문제를 제대로 풀 수 있었을까? 

못 했을 거라고 생각한다 ㅎㅎ

 

function solution(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

이건 그래도 무슨 소리인지 한눈에 알겠다

left부터 right까지 반복하는 구문 안에서 i가 left부터의 숫자니까 j로 i를 나누어 약수의 개수를 카운팅했다.

그리고 약수의 개수(count)가 짝수, 홀수인지에 따라 값을 가감했다

나는 배열에 넣고 이래저래 복잡하게 했는데 큰 반복문에 넣으니까 배열에 저장할 필요없다.

아주 굿!

Comments