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

JavaScript 다차원 배열에서 가장 큰 요소 찾기

이 글에서는 임의의 깊이까지 중첩된 숫자 배열을 입력받아, 배열 안에서 가장 큰 숫자를 반환하는 JavaScript 함수를 작성해 보겠습니다.

문제 예시

입력 배열이 다음과 같다고 가정해 봅시다.

const arr = [
    34, 65, 67,
    [
        43, 76, 87, 23, 56, 7,
        [
            54, 7, 87, 23, 79, 994, 2
        ],
        54
    ], 54, 4, 2
];

이 배열에서 가장 큰 숫자는 994이므로, 함수는 다음과 같은 값을 반환해야 합니다.

994

접근 방법: 재귀 호출

배열이 몇 단계로 중첩되어 있는지 사전에 알 수 없기 때문에, 재귀(recursion)를 활용하는 것이 가장 깔끔한 해결책입니다. 핵심 로직은 다음과 같습니다.

  • 배열의 각 요소를 순회합니다.
  • 요소가 배열이라면 해당 배열을 대상으로 함수를 다시 호출합니다.
  • 요소가 숫자라면 현재까지의 최댓값과 비교하여, 더 크면 값을 갱신합니다.
  • 초기 최댓값은 -Infinity로 설정하여 어떤 숫자와 비교하더라도 올바르게 동작하도록 합니다.

구현 코드

const arr = [
    34, 65, 67,
    [
        43, 76, 87, 23, 56, 7,
        [
            54, 7, 87, 23, 79, 994, 2
        ],
        54
    ], 54, 4, 2
];

const getGreatest = (arr, greatest = -Infinity) => {
    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            greatest = getGreatest(arr[i], greatest);
        } else if (arr[i] > greatest) {
            greatest = arr[i];
        }
    }
    return greatest;
};

console.log(getGreatest(arr));

여기서 주의할 점은 재귀 호출 앞에 return을 붙이면 안 된다는 것입니다. return을 사용하면 중첩 배열을 만나는 순간 함수가 즉시 종료되어, 뒤에 남아 있는 나머지 요소들을 검사하지 못하게 됩니다. 재귀 호출의 결과를 greatest 변수에 다시 할당해야 배열의 모든 요소를 빠짐없이 탐색할 수 있습니다.

출력 결과

콘솔에는 다음과 같이 출력됩니다.

994

대안: flat()과 Math.max() 활용하기

ES2019에서 도입된 Array.prototype.flat() 메서드를 사용하면 훨씬 더 간결하게 해결할 수 있습니다. flat(Infinity)는 배열을 완전히 평탄화해 주므로, 이후 Math.max()만 호출하면 됩니다.

const getGreatest = arr => Math.max(...arr.flat(Infinity));

console.log(getGreatest(arr)); // 994

다만 이 방식은 배열의 크기가 매우 클 경우 전개 연산자(...)로 인한 스택 오버플로 위험이 있으므로, 대규모 배열을 다룰 때는 재귀 방식이 더 안전합니다.