[풀이]
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. 약수의 개수를 가져오는 함수를 분리시킨 풀이다.
'코딩 테스트 > Programmers - 1' 카테고리의 다른 글
[JS] 같은 숫자는 싫어 (0) | 2022.10.01 |
---|---|
[JS] 최대공약수와 최소공배수 (0) | 2022.09.30 |
[JS] 행렬의 덧셈 (1) | 2022.09.26 |
[JS] 내적 (0) | 2022.09.26 |
[JS] 약수의 합 (1) | 2022.09.25 |