다음과 같이 숫자로 구성된 배열의 배열(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 ];
해결 방법
이 문제는 Array.prototype.map() 메서드와 Math.max() 함수를 조합하면 아주 간단하게 해결할 수 있습니다. map()으로 각 하위 배열을 순회하고, 전개 연산자(spread operator, ...)를 사용해 하위 배열의 요소들을 Math.max()의 인수로 펼쳐 전달하면 됩니다.
예제 코드
전체 코드는 다음과 같습니다.
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 => {
const max = Math.max(...sub);
return max;
});
};
console.log(constructBig(arr));출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ 48, 98, 65, 98, 89 ]
코드 동작 원리
- arr.map(sub => ...): 원본 배열의 각 하위 배열(sub)마다 콜백 함수를 실행하고, 그 반환값들로 새로운 배열을 생성합니다. 원본 배열은 변경되지 않습니다.
- Math.max(...sub): 전개 연산자(...)를 통해 하위 배열의 요소들이 개별 인수로 풀려 전달되므로, 해당 배열 내에서 가장 큰 값을 손쉽게 구할 수 있습니다.
참고: 대용량 배열에서의 대안
배열의 길이가 매우 클 경우 전개 연산자를 사용하면 호출 스택 한도를 초과해 오류가 발생할 수 있습니다. 이런 경우에는 reduce()를 활용하는 것이 안전합니다.
const max = sub.reduce((a, b) => Math.max(a, b), -Infinity);
두 방법 모두 시간 복잡도는 O(n × m)(n은 외부 배열의 길이, m은 각 하위 배열의 평균 길이)로 동일하므로, 상황에 맞게 선택하면 됩니다.