문제 설명
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ left ≤ right ≤ 1,000
내 코드
function solution(left, right) {
let answer = 0;
let nums = [];
for (let i = left; i < right + 1; i++) {
nums.push(i);
}
for (let i = 0; i < nums.length; i++) {
let sqrt = Math.sqrt(nums[i]);
if (Number.isInteger(sqrt) === true) {
answer -= nums[i]
} else {
answer += nums[i]
}
}
return answer;
}
풀이과정
- 일단 left에서 시작해서 right까지 하나의 배열을 만들고 싶어서 nums이라는 빈 배열에 for문을 통해 값을 left부터 하나씩 증가하여 right까지 값을 넣어 배열을 만들었다.
- 그렇게 만든 nums라는 배열을 for문으로 하나씩 돌면서 nums[i]가 제곱근이 정수인 경우는 약수가 홀수가 되기 때문에 nums[i]가 -연산이 이루어 질 수 있도록 했다. 아닌 경우에는 nums[i]가 +연산이 되도록 했다.
- 이 과정에서 Math.sqrt()를 이용하여 ()안의 수를 제곱근으로 만들어 주고 간단하게 sqrt변수를 새로 만들어 값을 할당해 주었다.
- 제곱근으로 만들었을 때 그 제곱근이 정수인 경우는 우리가 찾는 ex) nums[i] = 16인 경우 약수가 1, 2, 4, 8, 16 이렇게 5개. 즉, 홀수가 나온다. 왜냐 중간에 4가 있기 때문이다. 이것이 우리가 -해줘야하는 경우이다.
- 그래서 제곱근이 정수인 경우 해당 nums[i]를 -연산 해줘야하기 때문에 그것을 코드로 구현한 것이 Number.isInteger(sqrt) === true인 경우 nums[i]를 -연산 하는 것이다.