문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/77884
두 정수 left, right 가 매개변수로 주어진다.
left ~ right 까지 있는 모든 수들 중 약수의 개수가 짝수면 +, 홀수면 -
한 값을 return 하는 함수를 작성하시오.
function solution(left, right) {
let total = 0
for(let i = left; i <= right; i++ {
let len = createArrayDivisor(i).length
len % 2 === 0 ? total += i : total -= i
}
return total
}
// n의 약수의 배열을 반환
function createArrayDivisor(n) {
let arr = []
for(let i = 1; i <= n; i++ {
n % i === 0 ? arr.push(i) : 'continue'
}
return arr
}
const re = solution(13, 17)
console.log(re)
// 43
그리고 약수를 찾는 알고리즘에 대해서 더 알아보았다.
위에서는 약수를 구하기 위해서 1부터 n까지 해당하는 모든 수들을 계속 n에 대해 나누면서 나머지가 0이 되는 수를 찾았다.
이때 시간복잡도는 O(N)의 복잡도는 가진다.
function divisor(n) {
// 제곱근 구하기
let squareRoot = Math.floor(Math.sqrt(n))
let arr = []
for(let i = 1; i <= squareRoot; i++) {
if(n % i === 0) arr.push(i)
}
let newArr = arr.map(el => n / el)
arr = arr.concat(newArr)
// 정렬, 중복 제거
arr.sort((a, b) => a - b)
const set = new Set(arr)
arr = [...set]
console.log(arr)
}
function solution(left, right) {
let total = 0
for(let i = left; i <= right; i++) {
if(Number.isInteger(Math.sqrt(i))) total -= i
else total += i
}
return total
}
Number.isInteger(n) : n의 값이 정수면 true, 정수가 아니면 false 반환
Math.sqrt(n) : n의 제곱근 반환