function solution(left, right) {
// left 13부터 17까지의 갯수는 4 + (1) =
let countSave = [];
// left가 증가하여 right와 같을 경우 탈출 (right + 1 한 이유는 right의 순수값도 약수 구해야함)
while(left !== right + 1) {
let count = 0
// 해당 left 값의 약수 조건 측정
for(let i = 1; i <= left; i++) {
if (left % i === 0) {
count++
}
}
// 홀수면 ( - ) 짝수면 ( + ) 구분 후 배열에 저장
if (count % 2 === 0) {
countSave.push(left);
} else {
countSave.push(-left)
}
left++
}
// 저장한 배열들 총합 구하기
return countSave.reduce((x, y) => {
return x + y
})
}
이번 알고리즘을 한 번에 합격하여 매우 기분이 좋았다.
해당 left
의 요소가 홀수면 음수로 짝수면 양수로 구분짓는게 가장 핵심 포인트인 것 같다.
push
를 통해 배열에 부호를 구분하면 음수, 양수 쉽게 대입할 수가 있다.
만일 위의 방법이 아니라면,,,, 아마 문자열에 "-5"를 다시 숫자로 변환해서 복잡한 로직이 구성될 것이다.
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;
}
😮 우와~~ 이거이거 코드 해답 물건이네 이야,,
위의 내가 푼 코드보고 이걸 보니 갑자기 부끄러워 진다.
Number.isInteger
은 정수면 true 그 외는 다 false로 판별하는 메서드이다.
(필자는 금일 이런 메서드 처음 본다...)
즉, 제곱근으로 Math.sqrt()
홀수는 정수, 짝수는 실수로 판별된다.. (너무 신기한데,,,)
해당 코드는 실행 속도도 워낙 빠르기에 최적의 로직인 것 같다.
도대체 이런 생각을 어떻게 했는지 신기하구먼,,, 오늘도 한수 배우고 간다.