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

JavaScript로 2차원 배열 재구성(Reshape)하는 방법

문제 정의

숫자로 이루어진 2차원 배열 arr을 첫 번째 인수로, 그리고 원하는 행렬의 행(row) 개수 r열(column) 개수 c를 각각 인수로 받는 JavaScript 함수를 작성해야 합니다.

이 함수는 입력 배열의 요소들을 기존과 동일한 행 우선 순회(row-traversing) 순서를 유지하면서, 지정된 행과 열의 크기를 가진 새로운 2차원 배열을 만들어 반환해야 합니다.

입력 예시

const arr = [
    [6, 7],
    [8, 9]
];
const r = 1, c = 4;

출력 결과

const output = [[6, 7, 8, 9]];

출력 설명

배열 arr을 행 우선으로 순회하면 [6, 7, 8, 9]가 됩니다. 새롭게 재구성할 행렬은 1 × 4 크기이므로, 앞서 얻은 순서대로 요소를 한 행씩 채워 넣으면 위와 같은 결과가 나옵니다.

핵심 로직

재구성이 가능하려면 원래 배열의 전체 요소 개수와 목표 행렬의 전체 요소 개수(r × c)가 반드시 일치해야 합니다. 개수가 다르면 변환할 수 없으므로 원본 배열을 그대로 반환합니다.

개수가 일치한다면, 모든 요소를 순서대로 순회하면서 임시 배열에 하나씩 담고, 임시 배열의 길이가 열 개수(c)에 도달할 때마다 결과 배열에 한 행으로 추가하는 방식으로 구현합니다.

구현 코드

const arr = [
    [6, 7],
    [8, 9]
];
const r = 1, c = 4;

const reshapeArray = (arr, r, c) => {
    // 요소 개수가 일치하지 않으면 원본 배열 반환
    if (r * c !== arr.length * arr[0].length) {
        return arr;
    }
    const res = [];
    let row = [];
    arr.forEach(items => items.forEach((num) => {
        row.push(num);
        if (row.length === c) {
            res.push(row);
            row = [];
        }
    }));
    return res;
};

console.log(reshapeArray(arr, r, c));

콘솔 출력

[[6, 7, 8, 9]]

정리

이 문제는 LeetCode의 'Reshape the Matrix' 유형 문제로, 2차원 배열을 다루는 대표적인 연습 문제입니다. 핵심 포인트는 다음 두 가지입니다.

첫째, r × c와 원본 배열의 총 요소 수가 같은지 먼저 검증하여 불가능한 경우를 처리합니다.
둘째, 중첩 forEach로 요소를 순회하며 열 개수 단위로 잘라 새로운 행을 구성합니다.

이 패턴은 이미지 데이터 변환이나 행렬 연산 등 실무에서도 자주 활용되므로, 로직을 이해하고 직접 구현해 보는 것이 좋습니다.