Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 다차원 배열에서 각 행의 최대값 추출하기

다음과 같이 숫자로 구성된 배열의 배열(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은 각 하위 배열의 평균 길이)로 동일하므로, 상황에 맞게 선택하면 됩니다.