문제

문제 링크
image

아이디어

등차수열이기 때문에 특정 수식으로 일반화할 수 있을 것 같았다.

  • i항에서 계산되는 값은 a + d * i 이므로,
  • 반복문을 돌면서 true일 때는 더해주고 false일 때는 더해주지 않는다.

내 코드

function solution(a, d, included) {
    // 인덱스가 i일 때 i+1항은 a + i + d이므로
    // true일 때 더해줌
    let answer = 0;
    for (let i = 0; i < included.length; ++i) {
        included[i] && (answer += a + d * i);
    }
    return answer;
}

다른 사람 코드

function solution(a, d, included) {
    return included.reduce((acc, flag, i) => {
        return flag ? acc + a + d * i : acc;
    }, 0);
}

reduce()를 이용한 풀이/ 사실 나도 reduce()를 쓰고 싶었는데, 왜인지 되지 않아서 for문으로 풀었었다. 생각해보니 reduce의 원리를 혼동해서 생긴 문제였다. 누산 형태이므로 true이든 false이든 기존 acc에 쌓인 값을 리턴해주었어야 했다. 그런데 나의 경우 true일 때만 리턴을 하고, false일 경우 뱉어주는 값이 없어서 계산이 잘못됐었다.

문법 정리

Array.prototype.reduce()

MDN Array.prototype.reduce()