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

JavaScript로 중첩 배열에서 가장 짧은 하위 배열 찾는 방법

JavaScript를 다루다 보면 배열 안에 여러 개의 배열이 중첩된 구조(배열의 배열)를 만나게 됩니다. 이때 포함된 요소의 개수가 가장 적은, 즉 가장 짧은 하위 배열을 찾아야 하는 경우가 종종 있습니다.

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

const arr = [
    ["LEFT", "RIGHT", "RIGHT", "BOTTOM", "TOP"],
    ["RIGHT", "LEFT", "TOP"],
    ["TOP", "LEFT"]
];

여기서 우리가 작성해야 할 함수는 이러한 배열을 인자로 받아, 요소 개수 기준으로 가장 작은 하위 배열을 골라 반환하는 것입니다.

해결 방법: reduce() 활용하기

이 문제는 배열 메서드인 reduce()를 사용하면 깔끔하게 해결할 수 있습니다. 각 하위 배열을 순회하면서 현재까지 발견한 최소 길이와 비교하고, 더 짧은 배열을 발견하면 결과를 교체하는 방식입니다. 참고로 아래 코드는 길이가 같은 하위 배열이 여러 개일 경우 모두 함께 반환하도록 확장한 버전입니다.

예제 코드

const arr = [
    ["LEFT", "RIGHT", "RIGHT", "BOTTOM", "TOP"],
    ["RIGHT", "LEFT", "TOP"],
    ["TOP", "LEFT"]
];

const findShortest = (arr = []) => {
    const res = arr.reduce((acc, val, ind) => {
        // 첫 번째 요소이거나, 지금까지의 최소 길이보다 짧으면 교체
        if (!ind || val.length < acc[0].length) {
            return [val];
        };
        // 길이가 같으면 결과에 추가
        if (val.length === acc[0].length) {
            acc.push(val);
        };
        return acc;
    }, []);
    return res;
};

console.log(findShortest(arr));

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

[ [ 'TOP', 'LEFT' ] ]

코드 동작 원리 살펴보기

  • 초기값: reduce()의 초기값으로 빈 배열 []을 전달합니다.
  • 첫 번째 순회: 인덱스가 0(!ind)일 때는 무조건 해당 배열을 결과로 설정합니다.
  • 길이 비교: 이후 요소부터는 누적 값(acc)에 저장된 배열보다 길이가 짧으면 결과를 새로 교체합니다.
  • 동률 처리: 길이가 같은 하위 배열이 있다면 기존 결과에 함께 추가하여 여러 개를 반환할 수 있도록 합니다.

위 예제에서는 세 번째 하위 배열인 ["TOP", "LEFT"]가 요소 2개로 가장 짧기 때문에 해당 배열만 담긴 배열이 최종 결과로 반환됩니다. 이 접근 방식은 배열을 한 번만 순회하므로 시간 복잡도가 O(n)으로 효율적이며, 다양한 실무 상황에서 응용할 수 있습니다.