[코테] 약수의 개수와 덧셈

JulyK9·2023년 1월 4일
0

문제

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

제출코드

function solution(left, right) {
    
  let result = 0;

  // left부터 right 까지 숫자를 탐색
  for (let i = left; i <= right; i++) {
      
    // 짝홀 카운팅할 변수 선언
    let count = 0;

    // 약수 체크(나누어 떨어지는 수)
    for (let k = 1; k <= i; k++) {
        
      // 약수가 구힐 때마다 카운팅
      if (i % k === 0) {
        count++;
      }
    }
    // 반복후 약수 개수(count) 체크
    // console.log("count: ", count)
      
    // 짝홀 여부에 따라 결과값에 해당수를 연산 처리
    count % 2 === 0 ? (result += i) : (result -= i);
  }
  return result;
}

접근과정

  • 우선 인자로 통해 정해지는 구간안의 숫자를 탐색해줘야 하므로 반복문 사용
  • 해당 숫자의 약수 개수를 체크해줘야 하므로 반복문을 통해 약수가 구해질때마다 카운팅을 해줌
  • 카운팅 숫자에 따라 약수의 짝홀 개수를 판단할 수 있으므로 그에 따라 연산 처리 해주고 결과값 도출

다른풀이

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;
}
  • 약수의 개수가 홀수인 경우와 짝수인 경우의 차이가 제곱근이 정수인 경우를 활용 굿굿
  • 이 내용은 아래와 같이 예시를 살펴보다가 인지가 됐었지만, 수학적인 용어로 정리가 잘 되지 않았고 어떻게 구현할지 고민하다 위와 같은 방법으로 전환하여 구현했는데, 이런 적합한 메서드가 있는지는 처음 알게 되었다.
// 13 1 13
// 14 1 2 7 14
// 15 1 3 5 15
// 16 1 2 4 8 16 홀 (같은 수를 곱한 약수가 존재)
// 17 1 17

// 24 1 2 3 4 6 8 12 24
// 25 1 5 25 홀 (같은 수를 곱한 약수가 존재)
// 26 1 2 13 26
// 27 1 3 9 27

// 결론
// 약수의 개수가 홀수인 경우는 같은 수를 곱해서 나오는 경우만 해당됨
  • Number.isInteger()는 주어진 값이 정수인지 판단(true, false)하는 메서드인데 제곱근이 정수인지 여부를 확인하면 되므로 Math.sqrt() 메서드로 제곱근을 구하고 적용해준 방법

참고자료

MDN - Number.isInteger()
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
MDN - Math.sqrt()
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt

profile
느리지만 꾸준하게. 부족하거나 잘못된 부분은 알려주시면 감사하겠습니다.

0개의 댓글