두 정수 a, d와 길이가 n인 boolean 배열 included가 주어집니다. 첫째항이 a, 공차가 d인 등차수열에서 included[i]가 i + 1항을 의미할 때, 이 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return 하는 solution 함수를 작성해 주세요.
제한사항
function solution(a, d, included) {
return included.reduce((acc, cur, i) => {
if (cur == true) {
const sum = a + i * d;
return acc + sum;
}
return acc;
}, 0)
}
acc
는 누적값, cur
는 배열의 현재 요소, i
는 현재 처리하고 있는 배열 요소의 index const sum = a + i * d;
이를 통해 구할 수 있다. An = A1 + (n-1)*d
이번엔 기필코 reduce를 사용해보리라 생각해보고 고민 엄청 했다...
누적값을 구해야 하니까 reduce를 사용하는게 효율적인 방법일거라 생각했다.
콘솔에 엄청 찍어보면서 했다. 결국 비슷하게 한 것 같은데 계속 값이 틀렸던 이유... 등차수열의 합이라는 조건을 놓치고 있었다. false일 지라도 등차수열이기 때문에 더해야 할 값이 계속 커진다는 사실! i(currentIndex)를 사용해서 해결!
function solution(a, d, included) {
return included.reduce((acc, flag, i) => {
return flag ? acc + a + d * i : acc
}, 0)
}
이걸 더 줄일 수가 있단 말이야...?
flag
는 boolean 값으로, 배열의 각 요소가 특정 조건(여기서는 true or false)을 만족하는지 여부를 나타내준다 flag
를 활용하는 방법을 배웠다!
function solution(a, d, included) {
var answer = 0;
// 1. 등차수열을 만든다
let arr = [];
while(arr.length < included.length){
arr.push(a);
a = a + d;
}
// 2. true번 째만 뽑아서 더한다
for(let i = 0; i < arr.length; i++){
if(included[i] === true){
answer += arr[i];
}
}
return answer;
}
등차수열을 따로 만들어줄 수도 있구나! reduce 함수 안에 등차수열을 어떻게 꾸역꾸역 넣나... 고민하고 있었는데 이렇게 따로 만들어서 해줄 수도 있던 것을 너무 오래 붙잡았다!
reduce 마니 연습해야지 😌