:ledger: 문제 설명

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

:one: 제한사항

  • 1 ≤ left ≤ right ≤ 1,000

:two: 입출력 예

left right result
13 17 43
24 27 52

:three: 입출력 예 설명

:pushpin: 3-1) 입출력 예 #1

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

:pushpin: 3-2) 입출력 예 #2

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

:ledger: 문제 풀이

const solution = (left, right) => {
  let arr = [];
  let total = 0;
  for (let i = left; i <= right; i++) {
    for (let x = 1; x <= i; x++) {
      if (i % x === 0) {
        arr.push(x);
      }
    }
    if (arr.length % 2 === 0) {
      console.log("arr 짝 =>", i);
      total += i;
      arr = [];
    } else {
      console.log("arr 홀 =>", i);
      total -= i;
      arr = [];
    }
  }
  return total;
};
solution(13, 17);

:one: 함수 선언

  • 화살표 함수를 사용하여 left, right를 매개변수로 받는다.

:two: 풀이

  • 먼저 left 부터 right 까지의 모든 수들 중에서, 글을 읽고 for문을 쓰자.. 하고 시작은 left, 끝은 right 로 생각을 하고 작성함
  • 위의 for문에서 순회하는 값들 중 약수를 찾기 위해 2중 For문을 사용하여 1~순회하는 값(left) 중 약수를 모두 arr 변수에 담아주었다.
  • 이후 if문을 통해 arr.length 가 짝수인지 홀수인지 판별하여 짝수면 + 홀수면 -를 해주어 total 에 값을 넣어주고 다시 순회하는 left를 계산하기 위해 초기화해주었다.

:three: 결과 반환

  • left = 13, right = 17을 대입하면 43을 리턴함
  • left = 24, right = 27을 대입하면 52를 리턴함

:fire: 다른 사람의 풀이 참고

요즘 과제하느라 알고리즘을 많이 못 풀었는데, 뇌가 굳은 것 같다. 지난 풀이는 나름 자신있었어서 이번 풀이도 오기로 혼자서 풀어보겠다고 했지만.. 생각보다 시간도 많이 걸렸다. 다른 사람들의 풀이를 보니 나와같이 for문을 사용한 풀이도 있고 sqrt(제곱근) 공식을 사용하여 푼 풀이가 있다. 정말 많이 축약되고 새로 알게 된 공식은 제곱근이 정수면 약수의 개수가 홀수다.. 이다..

// [384명] 총합 - sqrt를 사용한 풀이과정
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;
}

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges