문제 소개
다음과 같이 숫자로 이루어진 2차원 배열(배열 안에 배열이 중첩된 형태)이 있다고 가정해 보겠습니다.
const arr = [
[1, 16, 34, 48],
[6, 66, 2, 98],
[43, 8, 65, 43],
[32, 98, 76, 83],
[65, 89, 32, 4],
];이 배열을 순회하면서 각 하위(내부) 배열에서 가장 큰 요소(최댓값)를 추출하고, 그 값들로만 구성된 새로운 배열을 반환하는 함수를 작성해야 합니다.
즉, 위 배열에 대한 기대 결과는 다음과 같습니다.
const output = [
48, // 첫 번째 하위 배열의 최댓값
98,
65,
98,
89 // 마지막 하위 배열의 최댓값
];해결 방법: map() + Math.max()
이 문제는 Array.prototype.map()과 Math.max()를 조합하면 매우 간결하게 해결할 수 있습니다. map()은 원본 배열을 변경하지 않고 각 요소를 변환한 새로운 배열을 반환하므로, 하위 배열별 최댓값 목록을 만드는 데 적합합니다.
const arr = [
[1, 16, 34, 48],
[6, 66, 2, 98],
[43, 8, 65, 43],
[32, 98, 76, 83],
[65, 89, 32, 4],
];
const constructBig = arr => {
return arr.map(sub => Math.max(...sub));
};
console.log(constructBig(arr));코드 동작 원리
arr.map(sub => ...)— 바깥쪽 배열을 순회하면서 각 하위 배열sub에 대해 콜백 함수를 실행합니다.Math.max(...sub)— 전개(spread) 연산자...를 사용해 하위 배열의 요소들을 개별 인수로 펼쳐Math.max()에 전달하고, 그중 최댓값을 계산합니다.map()의 반환값 — 각 하위 배열의 최댓값으로 채워진 새 배열입니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 출력이 나타납니다.
[ 48, 98, 65, 98, 89 ]참고: reduce()를 사용한 대안
전개 연산자 없이 reduce()를 사용해도 동일한 결과를 얻을 수 있습니다.
const constructBig = arr =>
arr.map(sub => sub.reduce((max, n) => (n > max ? n : max), -Infinity));성능 팁: 요소 수가 수만 개 이상인 매우 긴 하위 배열에는 전개 연산자 방식이 호출 스택 한도 초과 오류를 일으킬 수 있으므로, 이 경우 reduce() 방식이 더 안전합니다. 일반적인 크기의 배열이라면 두 방법 모두 문제없이 동작합니다.