[프로그래머스-기초] 등차수열의 특정한 항만 더하기

JE·2024년 1월 10일
0

코테/코플릿

목록 보기
48/57

등차수열의 특정한 항만 더하기

문제 설명

두 정수 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가 적어도 하나 존재합니다.

입출력 예

adincludedresult
34[true, false, false, true, true]37
71[false, false, false, true, false, false, false]10

입출력 예 설명

입출력 예 #1
예제 1번은 a와 d가 각각 3, 4이고 included의 길이가 5입니다. 이를 표로 나타내면 다음과 같습니다.

1항2항3항4항5항
등차수열371115
includedtruefalsefalsetrue

따라서 true에 해당하는 1항, 4항, 5항을 더한 3 + 15 + 19 = 37을 return 합니다.

입출력 예 #2
예제 2번은 a와 d가 각각 7, 1이고 included의 길이가 7입니다. 이를 표로 나타내면 다음과 같습니다.

1항2항3항4항5항6항7항
등차수열789101112
includedfalsefalsefalsetruefalsefalse

따라서 4항만 true이므로 10을 return 합니다.

💻 내가 작성한 코드

function solution(a, d, included) {
    let numArr = [a];
    let number = 0;
    for(let i = 0; i < included.length - 1; i++){
        if(i < included.length){
            numArr.push(a += d)
        }        
    }

    for(let i = 0; i < included.length; i++){
        if(included[i] === true){
            number = number + numArr[i]
        }
    }

    return number
}

이번 문제를 그렇게 어렵지 않았다.
a, d의 등차수열 값을 included의 길이 만큼 만들어 주고

included[i] 요소가 true인 해당 index를 만족하는 등차수열 값을 전부 더한 값을 반환하면 된다.

a 값을 미리 넣은 배열 numArr와 반환할 number를 선언해 줬다.

included를 for문을 사용해 순환하고
a + d 값을 numArr에 push했다.

다시 included를 순환하고 included[i]가 true인 경우
number에 해당 index영역인 numArr[i]를 더해줘 반환했다.

🛠️ 코드 개선(다르게) 풀어보기

function solution(a, d, included) {
    let numArr = [a];
    
    included.map((el, idx) => (
        idx < (included.length - 1) ? numArr.push(a += d) : el
    ))
    
    return numArr.reduce((acc, cur, idx) => (
        included[idx] ? acc + cur : acc
    ), 0)
    
}

좀 더 간단하게 풀어 볼 수 있지 않을까 싶었다.

제일 먼저 들었던건 reduce메소드다 자주 사용하지 않아 이번에 작성해 봤다.

included[idx] ? acc + cur : acc
included[idx]요소가 true이면 이전 요소와 다음 요소를 더하고 그렇지 않은 경우 이전 요소 그대로 둔다.

초기 값은 0으로 잡았다. 이부분은
이번 작성했던 let number = 0;를 대체할 수 있고

바로 반환 할 수 있다.

더불어 map 메소드를 사용해 for문과 if문을 사용한 코드 내용을 간소화 했다.

💻 다른 사람이 작성한 코드

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

간결하게 작성하신 분들이 많으셨다.

여기에서 key point는 a + d * i가 아닐까 싶다.

등차수열 일반항 공식

a + d * n

등차수열 일반항 공식을 알고 있었다면 좀 더 수월하게 문제를 풀 수 있지 않았을까 싶다.

코딩 테스트는 확실히 수학 영역을 못하면 어려운게 많은거 같다ㅠ
다음에 비슷한 문제가 나오면 등차수열 일반항 공식으로 풀어봐야겠다.

profile
[프론트 애송이] 작은 깨달음도 기록하기

0개의 댓글