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

JavaScript로 2차원 배열의 각 행에서 최솟값을 찾아 합 구하기

문제 설명

숫자로 이루어진 2차원 배열을 인수로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 2차원 배열의 각 행에서 가장 작은 숫자를 추출한 뒤, 그 최솟값들을 모두 더한 합계를 반환해야 합니다.

예를 들어 다음과 같은 배열이 주어졌다고 가정해 보겠습니다.

[[2, 5, 1, 6], [6, 8, 5, 8], [3, 6, 7, 5], [9, 11, 13, 12]]

각 행의 최솟값은 차례대로 1, 5, 3, 9이므로, 함수는 1 + 5 + 3 + 9 = 18을 반환해야 합니다.

해결 접근 방식

이 문제는 두 단계로 나누어 해결할 수 있습니다.

  1. 행별 최솟값 찾기: reduce() 메서드와 Math.min()을 조합하여 각 하위 배열의 최소값을 계산합니다.
  2. 합계 누적: forEach()로 각 행을 순회하면서 최솟값을 합산 변수에 더합니다.

예제 코드

다음은 전체 구현 코드입니다 −

const arr = [
    [2, 5, 1, 6],
    [6, 8, 5, 8],
    [3, 6, 7, 5],
    [9, 11, 13, 12]
];
const sumSmallest = (arr = []) => {
    const findSmallest = array => array.reduce((acc, val) => {
        return Math.min(acc, val);
    }, Infinity)
    let sum = 0;
    arr.forEach(sub => {
        sum += findSmallest(sub);
    });
    return sum;
};
console.log(sumSmallest(arr));

코드 설명

  • findSmallest: 초기값을 Infinity로 설정한 후 reduce()를 실행하여 배열 내 최솟값을 구하는 헬퍼 함수입니다. Infinity를 초기값으로 사용하면 어떤 숫자와 비교하더라도 올바른 최솟값이 도출됩니다.
  • sumSmallest: forEach()를 통해 각 행(하위 배열)의 최솟값을 sum 변수에 누적한 뒤, 최종 합계를 반환합니다.

출력 결과

18

더 간결한 대안 코드

spread 연산자(...)와 함께 map() 또는 reduce()를 활용하면 같은 로직을 한 줄로 표현할 수도 있습니다.

const sumSmallest = arr =>
    arr.reduce((sum, row) => sum + Math.min(...row), 0);

console.log(sumSmallest(arr)); // 18

Math.min(...row)는 spread 연산자를 통해 하위 배열의 요소들을 개별 인수로 펼쳐 전달하므로, 별도의 헬퍼 함수 없이도 각 행의 최솟값을 손쉽게 구할 수 있습니다. 다만 배열의 길이가 매우 클 경우 스택 오버플로 위험이 있으므로, 대량의 데이터를 다룰 때는 앞서 소개한 reduce 기반 방식이 더 안전합니다.