[프로그래머스 / lv1] 약수의 개수와 덧셈

[프로그래머스 / lv1] 약수의 개수와 덧셈

문제

문제 설명


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

제한사항


  • 1 ≤ left ≤ right ≤ 1,000

입출력 예


leftrightresult
131743
242752

입출력 예 설명


입출력 예 #1

  • 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.
약수약수의 개수
131, 132
141, 2, 7, 144
151, 3, 5, 154
161, 2, 4, 8, 165
171, 172
  • 따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.
약수약수의 개수
241, 2, 3, 4, 6, 8, 12, 248
251, 5, 253
261, 2, 13, 264
271, 3, 9, 274
  • 따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.

풀이


function solution(left, right) {
  let numArr = [];

  for (let i = left; i <= right; i++) {
    let cnt = 0;
    for (let j = 1; j <= i; j++) {
      if (i % j === 0) {
        cnt += 1;

        if (i === j) {
          if (cnt % 2 === 0) {
            numArr.push(i);
          } else {
            numArr.push(-i);
          }
        }
      }
    }
  }
  return numArr.reduce((acc, cur) => (acc += cur), 0);
}

느낀점


이번 문제는 생각보다 꽤 오래 걸렸던거 같다. 처음에 for문을 써야한다고는 알고 있었지만 for문을 두번 돌리고 어떻게 풀어야할지 감을 잡지 못했다. 그러다가 그냥 cnt라는 변수를 선언하고 값을 증가시키고 해당 값이 짝수이면 제일 처음 선언해둔 numArr에 넣어주면 된다고 생각했다. 근데 i와 j가 같을때인 즉, 제일 마지막일때 cnt값이 짝수냐 홀수냐에 따라 배열안에 넣어줬다. 그래도 머리를 좀 써서 풀다보니 나름 재밌었던거 같다.


© 2024. All right reserved Min