[js] 등차수열의 특정한 항만 더하기 (lv.0, 정답률 87%)

sookyoung.k·2024년 4월 16일
0
post-thumbnail

두 정수 a, d와 길이가 n인 boolean 배열 included가 주어집니다. 첫째항이 a, 공차가 d인 등차수열에서 included[i]가 i + 1항을 의미할 때, 이 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return 하는 solution 함수를 작성해 주세요.

제한사항

  • 1 ≤ a ≤ 100
  • 1 ≤ d ≤ 100
  • 1 ≤ included의 길이 ≤ 100
  • included에는 true가 적어도 하나 존재합니다.

😏 나의 풀이

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
  • 초기값을 0으로 준 후 배열을 순회화며 계산한다
  • 조건을 걸어주었다. 배열의 현재 요소가 true일 경우에만 누적된 값에 새로운 값을 더해준다.
  • 더하는 값은 현재 항의 등차수열 값이다. 이는const sum = a + i * d; 이를 통해 구할 수 있다.
  • * 등차수열의 n번째 항 계산하기 An = A1 + (n-1)*d
    어차피 i는 0부터 시작하니까 (n-1)이 i가 됨

이번엔 기필코 reduce를 사용해보리라 생각해보고 고민 엄청 했다...
누적값을 구해야 하니까 reduce를 사용하는게 효율적인 방법일거라 생각했다.
콘솔에 엄청 찍어보면서 했다. 결국 비슷하게 한 것 같은데 계속 값이 틀렸던 이유... 등차수열의 합이라는 조건을 놓치고 있었다. false일 지라도 등차수열이기 때문에 더해야 할 값이 계속 커진다는 사실! i(currentIndex)를 사용해서 해결!

🤑 다른 풀이 1

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

이걸 더 줄일 수가 있단 말이야...?

  • flag는 boolean 값으로, 배열의 각 요소가 특정 조건(여기서는 true or false)을 만족하는지 여부를 나타내준다
  • true일 경우 누적값에 등차수열의 n항의 값을 더해준다
  • false일 경우 덧셈 x

flag를 활용하는 방법을 배웠다!

😎 다른 풀이 2

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 마니 연습해야지 😌

profile
영차영차 😎

0개의 댓글