문제 출처
https://www.c0d3.com/curriculum/js2
Write a function called solution that replicates Array.prototype.reduce and call it cReduce.
Callback takes 4 input parameters, accumulator, element, index and original array. documentation
result = [5,8,7].cReduce( (acc, e, i, arr) => {
console.log(acc, e, i, arr)
return acc + e + i
}, 'hi')
// console.log will be called 3 times:
// 'hi', 5, 0, original array
// 'hi50', 8, 1, original array
// 'hi5081', 7, 2, original array
// result will be 'hi508172'
It is best practice to pass in 2 arguments into reduce function. Therefore, for this challenge, you can assume that when your function, cReduce, will always be called with 2 arguments: a function and initial value.
문제 )
배열의 reduce 메서드와 같은 동작을 하는 cReduce라는 기능(function)을 작성해라.
cReduce는 인수로 콜백함수와 초깃값(initial value)을 가진다.
cReduce의 콜백 함수는 4개의 파라미터를 가진다. (accumulator, element, index, original array)
result = [5,8,7].cReduce( (acc, e, i, arr) => {
console.log(acc, e, i, arr)
return acc + e + i
}, 'hi')
// console.log will be called 3 times:
// 'hi', 5, 0, original array
// 'hi50', 8, 1, original array
// 'hi5081', 7, 2, original array
// result will be 'hi508172'
//
요구사항 )
배열에서 활용하는 메서드의 작동 원리를 알고 실제로 구현해보는 문제입니다.
배열의 구조, 콜백함수, 재귀함수, prototype inheritance에 대한 이해가 필요합니다.
스스로 풀이한 해답)
const solution = () => {
Array.prototype.cReduce = function (cb, acc = 0, i = 0) {
if (this.length <= i) return acc
if (acc === 0 && i === 0 && typeof this[i] === 'string') {
acc = ""
}
acc = cb(acc, this[i], i, this)
return this.cReduce(cb, acc, i + 1)
}
}
모든 배열에 상속이 가능한 cReduce라는 기능을 작성한다. (Array.prototype.cReduce)(이 때 function은 모든 배열에 상속되어야 하는 개념이므로, 선언형으로 작성되어야 한다.)reduce 메서드의 기능처럼, 내부 배열의 순환이 종료되면 acc(누산값)을 리턴해야 한다.(this.length <= i) return accreduce 메서드의 파라미터는 2개로, 콜백함수와 초깃값이 있다. 이 초깃값을 어떻게 제어할것인지를 사고한다.콜백함수에 4개의 파라미터를 전달하고, 그 리턴값은 acc가 된다.리턴된 acc값은 this.cReduce에 의해 재귀된다.
제주알고리즘베이스캠프에서 피드백을 듣고 수정한 답안
Array.prototype.cReduce = function(cb, acc, i = 0) {
if (this.length <= i) return acc
if (acc === undefined) {
acc = this[i]
i = i + 1
}
acc = cb(acc, this[i], i, this)
return this.cReduce(cb, acc, i + 1)
}
1) 초깃값이 입력되지 않았을 때, 리듀스 메서드는 배열의 첫번째 값이 초깃값이 된다.
2) 내가 처음에 짠 코드는 초깃값이 입력되지 않았을때에 대한 고려가 되어있지 않다.
3) 따라서 테스트케이스 및 전제가 잘못되었으며, 문제의 조건을 바꿀 필요가 있다.
4) acc가 입력되지 않았을 경우(undefined), 그 값을 첫번째 배열의 값으로 바꾸고
5) 인덱스를 하나씩 늘려줌으로써 해결이 가능하다.
'알고리즘, 자료구조' 카테고리의 다른 글
(문제 해결 패턴) 멀티플 포인터 패턴 (0) | 2022.11.01 |
---|---|
(문제 해결 패턴) 빈도수 찾기 패턴 (0) | 2022.10.31 |
문제 해결 접근법 (How to solve it) (0) | 2022.08.05 |
배열(Arrays)의 BIgO 성능 (0) | 2022.08.04 |
객체(Object)의 BigO 성능 (0) | 2022.08.04 |