등차수열의 특정한 항만 더하기
두 정수 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가 적어도 하나 존재합니다.
a b include result 3 4 [true, false, false, true, true] 37 7 1 [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;
}
통과!