문제 설명
숫자로 이루어진 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을 반환해야 합니다.
해결 접근 방식
이 문제는 두 단계로 나누어 해결할 수 있습니다.
- 행별 최솟값 찾기: reduce() 메서드와 Math.min()을 조합하여 각 하위 배열의 최소값을 계산합니다.
- 합계 누적: 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 기반 방식이 더 안전합니다.