강의 들으면서 열심히...몽고DB랑 kjy-shop 프로젝트를 연결했다....
1) 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
//내가 짠 코드
let solution = (left,right) => {
let arr=[];
let num = 0;
for(i=0; i<=right-left; i++){
arr.push(left+i)
}
let results = arr.map((n)=> {
let result = [];
for (i = 1; i<=n; i++) {
if (n % i === 0) {
result.push(i);
}
}
return result;
})
results.forEach((array)=>{
if(array.length%2===0){
num+=array[array.length-1]
} else {
num-=array[array.length-1]
}
})
return num
}
//내가 짠 코드 2
let solution = (left,right) => {
let arr=[];
for(i=0; i<=right-left; i++){
arr.push(left+i)
}
return arr.reduce((pre,now)=>{
let num = Math.sqrt(now);
if(num%1 === 0){
return pre-now;
} else {
return pre+now
}
},0)
}
//다른 사람 코드
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;
}
//다른 사람 코드 2
function solution(left, right) {
let answer = 0;
for (let i = left; i <= right; i++) {
let count = 0;
for (let j = 1; j <= i; j++) {
if (i % j === 0) count++;
}
if (count % 2) answer -= i;
else answer += i;
}
return answer;
}
두 번 풀었다. 처음에는 약수를 전부 구해서 배열로 담은 새 배열을 리턴하고->그 약수가 담긴 배열의 length를 구하여 짝수면 배열의 마지막 값(예 : [1,2,3,6]에서 6)을 더하고 홀수면 마지막 값을 빼도록 알고리즘을 짰는데... 만들다보니까 대체 약수가 짝수가 아닌 경우는 어떤 경우지? 라는 생각이 들었음... 본인의 제곱근 하나가 더 들어 있으면 홀수가 된다. 즉, 정수를 제곱한 수라면 빼 줘야 한다. 그래서 reduce를 써서 한 번 더 풀었다. 제곱근을 구하고, 그 제곱근이 정수라면 빼주고 정수가 아니라면 더해주는 식으로 진행했다.
다른 사람이 푼 코드(1)를 보니 동일한 원리를 이용했는데, 뭔가... isInteger라는 함수가 있는 듯 했다. 처음 알았음!
그리고 다른 사람이 푼 코드(2)도... for문으로 전체 숫자 루프를 돌려서 나누어떨어지는 횟수만큼 count에 더해준 듯하다. 그리고 그 횟수가 짝수면(2의 나머지가 없으면)+1, 홀수면 -1.. 이건 내 풀이(1)과 동일한 원리다. 그러나 횟수가 중요하기 때문에 나처럼 약수를 전부 배열에 넣어두는 무식한 방법은 쓰지 않아도 되는 것이다...