개발일지

Reduce, map() 을 이용해 코딩테스트 풀기

이경욱 2023. 10. 24. 17:34

1. 문제

정수 배열 numbers가 매개변수로 주어집니다.

numbers의 각 원소에 두 배한 원소를 가진 배열을

return하도록 solution 함수를 완성해주세요.

 

let numbers = [1, 2, 3, 4, 5]

 

2. 풀이방식

내가 이 문제를 보고 들었던 풀이방식은

'for문을 돌려서 두 배씩 곱하면 되겠다' 

라고 생각이 들었다.

 

function solution1(numbers) {
    var answer = [];

    for (let i = 0; i < numbers.length; i++) {
        let x = numbers[i] * 2;
        answer.push(x)
    }
    return answer;
}

 

3. 해설

다 풀고 제출 후 다른 사람들의 풀이를 보니

배울 점이 많았다.

 

2가지 방법이 있었는데,

reduce와 map()이었다.

 

(1) reduce

function solution2(numbers) {
    return numbers.reduce((a, b) => [...a, b * 2], []);
}

처음에 보고 '뭔소리지..'했다가

reduce의 사용법을 한참 읽고서야 이해되었다.

 

하나하나 풀어가면,

- reduce라는 함수는 2개의 파라미터를 받는데

- 첫 번째는 callback function, 두 번째는 initialValue(Optional)이다.

- 첫 번째 파라미터인 callback function은 4가지의 인수를 가지고 있다.

  • accumlator : callback 함수의 반환값을 누적
  • currentValue : 배열의 현재 요소
  • index(Optional) : 배열 현재 요소의 인덱스
  • array(Optional) : 호출한 배열

- 두 번째 파라미터 initialValue 는 초기값을 설정하는 것이었다.

 

이제 저 코드를 이해하면,

- 초기값으로 빈 배열을 설정하고

- reduce 매개변수에 a (accumulator), b (currentValue)를 넣었다

- b 배열에 차례로 * 2를 하고 a에 누적을 시키는데

- ...(spread operator)를 통해 배열에 풀어서 전달하도록 코드를 짠 것 같다.

 

 

(2) map()

const solution3 = numbers.map((number) => number * 2)

map () 함수는 값과 인덱스를 받아

자동으로 for문을 돌려 값을 빼도록 해준다.

여기서 중요한건 기존 배열을 변경하지 않고 새로운 배열을 생성한다는 것이다.