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

강동욱·2024년 9월 3일
0

프로그래머스

목록 보기
11/33

문제

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

설명

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

입출력 예

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

풀이

처음 이 문제를 보고 뭔가 직감적으로 확 오지 않아서 일단 하나씩 구현해 보기로 했다.
일단 첫째항이 a, 공차가 d인 등차수열을 include 배열의 길이와 같은 길이로 만들자.

function solution(a, d, include){
	let arr = [];
    for(let i = 1; i < include.length; i++){
        arr[0] = a;
        arr[i] = arr[i-1] + d;
    }
    console.log(arr);
}

일단 첫번째 요소는 전달받은 a로 고정이니 arr[0]에 넣어주고
for문을 1부터 돌렸다. 콘솔에 찍어보니 잘나온다.

이제 include에서 true요소들의 index값을 찾아야하는데 indexOf를 사용해보려한다
indexOf는 찾는 요소가 없을 때 -1을 반환하므로 -1이 나올때까지 시작인덱스에 1씩 더하면서 반복해보자.
그리고 시작 인덱스는 include배열의 첫번째 true의 인덱스로 해보자

function solution(a, d, include){
	let startIndex = include.indexOf(true);
    while(startIndex != -1){
        console.log(startIndex);
        startIndex = include.indexOf(true,startIndex+1);
    }
}

콘솔을 확인해보니 true의 인덱스가 잘 나오는것을 확인했다.
두 코드를 잘 합쳐보자. 배열 arr의 각 startIndex에 해당하는 요소들을 result 변수에 계속 더해주고 return하면 될거같다.

function solution(a, d, included) {
   let answer = 0;
   let arr = [];
   let startIndex = included.indexOf(true);
   for(let i = 1; i < included.length;i++){
       arr[0] = a;
       arr[i] = arr[i-1] + d;
   }
   while(startIndex != -1){
       answer += arr[startIndex];
       startIndex = included.indexOf(true,startIndex+1);
   }
   console.log(arr)
   return answer;
}

코드를 실행해보면 통과인데 정답 제출을하니 하나의 케이스에서 오류가난다..!
어떤케이스인지는 안알려줘서 코드를 보며 고민을 해보니
내가 짠 코드는 include가 딱하나의 true요소를 가지고 있을 때 대응이 안되는거같다.
그래서 문제 조건에 include는 최소 하나 이상의 true를 가지고 있다고 했으니,
include의 길이가 1이면 a를 반환하면 될거 같다.
최종 코드는 아래와 같다.

function solution(a, d, included) {
   let answer = 0;
   let arr1 = [];
   let startIndex = included.indexOf(true);
   if(included.length === 1){
       return a;
   }
   for(let i = 1; i < included.length;i++){
       arr1[0] = a;
       arr1[i] = arr1[i-1] + d;
   }
   while(startIndex != -1){
       answer += arr1[startIndex];
       startIndex = included.indexOf(true,startIndex+1);
   }
   console.log(arr1)
   return answer;
}

통과!

profile
고군분투 퍼블리셔

0개의 댓글

관련 채용 정보