정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.
제한사항
n
≤ 1000function solution(n) {
let evenArr = [];
for (let i = 2; i <= n; i += 2) evenArr.push(i);
evenArr.reduce((acc, cul, i) => {
cul = acc + cul;
return (evenArr[i] = cul);
}, 0);
return evenArr.length == 0 ? 0 : evenArr[evenArr.length - 1]
}
우선 n까지의 숫자 중에서 짝수인 배열을 만들었다.
그리고 누적된 값으로 현재 위치의 값을 업데이트 해준 후 새로 만든 후 마지막을 반환해준다. 하지만 빈 배열일 수도 있기 때문에 삼항연산자를 통해 빈 배열일 때는 0을 반환한다.
reduce를 왜 이렇게 썼지?... 그 땐 이 방법만 떠올랐음.
하지만, 짝수의 합을 직접 계산하는 더 간단한 방법이 있다.
function solution(n) {
var half = Math.floor(n/2);
return half*(half+1);
}
Math.floor(n/2)를 하여 n까지의 숫자 중 짝수의 개수를 구할 수 있다. 숫자를 내림하여 가장 가까운 정수를 반환해준다.
구한 짝수의 개수를 이용해서 등차수열의 합 공식을 통해 누적 합산값을 구할 수 있다.
등차수열의 첫 번째 항 a는 2, 공차 d는 2이므로 n번째 항까지의 합은
n/2 * (2 + (n-1) *d
로 표현할 수 있다. 이 공식을 간략하게 하면n/2 * (1+n)
이 된다.
따라서 짝수의 개수와 그 개수에 1을 더한 값을 곱하면 짝수의 합을 계산할 수 있는 모든 값을 제공한다.
function solution(n) {
var answer = 0;
for(let i=2 ; i<=n ; i+=2)
answer += i;
return answer;
}
오... i를 2씩 증가시키기
function solution(n) {
return Array(n)
.fill()
.map((_, i) => i + 1)
.filter((v) => v % 2 === 0)
.reduce((acc, cur) => acc + cur, 0);
}
체이닝 메서드 개쩐다...!