문제 설명
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ left ≤ right ≤ 1,000
나의 풀이 :
function solution(left, right) {
var answer = 0;
let array = [];
let numOfDivisor = 0;
let numArray = [];
for ( let i = left; i < right+1 ; i++){
array.push(i) // left부터 right까지의 수를 배열로 구하기.
}
array.forEach((num,index) => {
numOfDivisor = 0 //매번 약수의 갯수를 초기화하기.
numArray = []; // 매번 0-num까지의 수 초기화하기.
for( let nums = 1; nums < num+1; nums++){
numArray.push(nums)
}
numArray.forEach((cur)=>{
if(num%cur == 0){ //1부터 num까지 약수인경우를 확인.
numOfDivisor ++; //약수일 경우마다 1씩 더하기
}
})
numOfDivisor % 2 == 0 ? array[index] = num : array[index] = -num
//약수의 갯수가 짝수이면 그냥 넣고, 홀수이면 마이너스를 붙여서 넣기
})
return answer = array.reduce((a,b)=> a+b,0);
}
내가 문제를 풀었던 프로세스 :
1) left부터 right까지의 수를 배열로 구하기 :
-> for ( let i = left; i < right+1 ; i++){
array.push(i)
}
2)left부터 right까지의 수가 들어간 배열 array에 있는 각 수마다 계산을 해주기 :
->array.forEach((num,index) => {}
3)각 수에 대하여 1부터 num까지의 수가 들어간 배열을 만들기 :
-> numArray = []; // 매번 0-num까지의 수 초기화하기.
for( let nums = 1; nums < num+1; nums++){
numArray.push(nums)
}
-> num이 13일 경우 1부터 13까지의 수가 차례대로 배열로 만들어짐
4)1부터 num까지의 수 중에서 약수인 수를 구하기 (약수를 구하는 방법은 나눴을때 나머지가 0인 수가 있으면 그 수는 약수이다) :
-> numArray.forEach((cur)=>{
if(num%cur == 0){ //1부터 num까지 약수인경우를 확인.
numOfDivisor ++; //약수일 경우마다 1씩 더하기
}
})
5)약수일때마다 numOfDivisor변수의 갯수를 +1씩 해줬으므로, 약수의 갯수가 구해졌다. 이제는 약수가 짝수인지, 홀수인지 판단한 다음,본래의 array 배열에 짝수일 경우 +로 홀수 일 경우 -를 붙여서 다시 넣어준다.
->numOfDivisor % 2 == 0 ? array[index] = num : array[index] = -num
//약수의 갯수가 짝수이면 그냥 넣고, 홀수이면 마이너스를 붙여서 넣기
})
6)array안에 있는 모든 배열의 수를 합해주기 :
-> return answer = array.reduce((a,b)=> a+b,0);
'코딩테스트' 카테고리의 다른 글
[백준]단어공부 (0) | 2021.06.14 |
---|---|
[백준] 더하기 사이클 (0) | 2021.06.14 |
[프로그래머스] 다트게임 (0) | 2021.05.27 |
[프로그래머스] 두 개 뽑아서 더하기 (0) | 2021.05.25 |
[프로그래머스] 키패드 누르기 (0) | 2021.05.22 |