코딩 테스트/Programmers - 1

[JS] 약수의 개수와 덧셈

hayeonn 2022. 9. 29. 20:17
반응형

[풀이]

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

  for (let i = left; i <= right; i++) {
    let divisor = [];
    for (let j = 1; j <= i; j++) {
      if (i % j === 0) divisor.push(j);
    }
    result += divisor.length % 2 === 0 ? i : -i;
  }
  return result;
}

1. 이중 for문을 사용해서 문제를 풀었다.

2. 바깥 for문은 left 에서 right 수 사이의 값을 돈다. (예시: left는 13이고 right가 17일 때 13 ~ 17 사이의 수를 도는 것)

3. 안쪽 for문은 13 ~ 17 사이의 수를 j 로 나눴을 때 나머지가 없다면 약수이므로 배열안에 담아준다.

4. 그리고 결과값에 약수를 담은 배열의 길이가 짝수일 때 i (즉, 13은 약수가 1, 13 으로 2개 이므로.. i 는 13)이고 홀수일 때 (예: i가 16일때 약수는 1, 2, 4, 8, 16 으로 5개이므로 -16) -i 를 해준다. 

5. 13 ~ 17 사이의 값을 다 변환 후 더해준 값을 반환한다.

 

[코드 리뷰]

function solution(left, right) {
  let result = 0;
  for (let i = left; i <= right; i++) {
    const divisorArr = [];
    
    for (let j = 1; j <= i; j++) {
      if (i % j === 0) divisorArr.push(j);
    }
    result += divisor.length % 2 === 0 ? i : -i;
  }
  return result;
}

1. 단순 divisor보다 배열이므로 divisors 또는 divisorArr이 더 적합하다. 

2. 배열이기 때문에 let 보다 const로 변수 선언하는게 적절하다.

3. 변수를 선언할 때 1순위로 const를 먼저 선언하고, 재할당이 필요하면 let으로 수정해주는게 좋다.

4. 변수 선언부분과 제어문을 문단 분리해야 좋은 가독성을 가져온다.

 

[추가 정리]

자바스크립트에서 배열과 객체는 mutable Data Type (변할수있는 데이터 타입)이고 값이 변경될 수 있다.

const arr = [1, 2, 3];
arr[0] = 4

arr // [4, 2, 3]

하지만 문자열 같은 경우는 대표적인 immutable Data Type(변하지 않는 데이터 타입)이다. 따라서 재할당이 필요하다.

const str = "abc";
str[0] = "d";

str // 'abc'

 

[추가 코드]

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

  for (let i = left; i <= right; i++) {
    result += getDivisorCount(i) % 2 === 0 ? i : -i;
  }

  return result;
}

function getDivisorCount(num) {
  let divisorCount = 0;

  for (let i = 1; i <= num; i++) {
    if (num % i === 0) divisorCount++;
  }

  return divisorCount;
}

1. 해당 문제를 배열로 관리해 매번 푸쉬하고 배열의 길이로 result에 값을 누적할 수 있지만, 단순히 Count로 관리하는 방법이다.

2. 약수의 개수를 가져오는 함수를 분리시킨 풀이다.