공부 및 일상기록

[알고리즘] 약수의 개수와 덧셈 본문

개발/알고리즘, 자료구조

[알고리즘] 약수의 개수와 덧셈

낚시하고싶어요 2023. 4. 20. 14:49

문제

문제 설명

  • 두 정수 left, right가 매개변수로 주어진다.
  • left부터 right까지의 모든 수들 중에서 약수의 개수가 짝수인 수는 더하고 홀수인 수는 뺀 수를 return 하라

제한 사항

  • 1<=left <= right <= 1,000

문제 풀이

나의 접근 방식

나는 일단 해당 숫자의 약수를 모두 구해서 배열로 만든 후, 해당 배열의 길이의 홀짝을 판별하여 더하거나 빼는 전략을 취했다.

실제 작성한 코드

function solution(a, b) {
  //최종 제출할 총 합을 미리 선언
  let num = 0;

  //모든 약수를 구하는 함수
  function dividers(number) {
    //약수들의 배열을 미리 선언
    let divider;
    // 약수는 1과 자기자신을 포함하므로 미리 1과 자기자신을 넣음, 하지만 1이 오는 경우 1만 넣어야함
    if (number === 1) {
      divider = [1];
    } else {
      divider = [1, number];
    }
    //1과 자기자신은 이미 추가했으므로 2부터 나눠떨어지는 수를 push함
    for (let i = 2; i < number; i++) {
      if (number % i === 0) {
        divider.push(i);
      }
    }
    return divider;
  }

  //입력받은 두 수 a부터 b까지 짝수이면 더하고 홀수이면 빼는 반복문
  for (let i = a; i <= b; i++) {
    if (dividers(i).length % 2 === 0) {
      num = num + i;
    } else {
      num = num - i;
    }
  }
  return num;
}

나는 dividers()라는 함수를 만들어 입력한 숫자의 배열을 만들었다. 약수는 나누어 떨어지는 모든 수 이므로 1과 자기자신은 반드시 포함되어야 한다. 하지만 입력 숫자가 1인경우 1만 포함하면 되기 때문에 if와 else를 이용하여 미리 1과 자기자신을 배열에 담았다.

그리고 2부터 해당 숫자까지 나누어 떨어지는 숫자를 해당 배열에 push하여 약수 배열을 구했다.

이제 dividers 함수는 만들었으므로, for문을 이용하여 a부터 b까지 (문제상으로는 left부터 right까지 이다.)의 모든 숫자를 검사해 배열의 길이가 짝수이면 더하고 홀수이면 빼주는 작업을 하였다.