두 정수 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 | d | included | result |
---|---|---|---|
3 | 4 | [true, false, false, true, true] | 37 |
7 | 1 | [false, false, false, true, false, false, false] | 10 |
입출력 예 설명
입출력 예 #1
예제 1번은 a와 d가 각각 3, 4이고 included의 길이가 5입니다. 이를 표로 나타내면 다음과 같습니다.
1항 2항 3항 4항 5항 등차수열 3 7 11 15 included true false false true 따라서 true에 해당하는 1항, 4항, 5항을 더한 3 + 15 + 19 = 37을 return 합니다.
입출력 예 #2
예제 2번은 a와 d가 각각 7, 1이고 included의 길이가 7입니다. 이를 표로 나타내면 다음과 같습니다.
1항 2항 3항 4항 5항 6항 7항 등차수열 7 8 9 10 11 12 included false false false true false false 따라서 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
등차수열 일반항 공식을 알고 있었다면 좀 더 수월하게 문제를 풀 수 있지 않았을까 싶다.
코딩 테스트는 확실히 수학 영역을 못하면 어려운게 많은거 같다ㅠ
다음에 비슷한 문제가 나오면 등차수열 일반항 공식으로 풀어봐야겠다.