문제 정의
숫자로 이루어진 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로 요소를 순회하며 열 개수 단위로 잘라 새로운 행을 구성합니다.
이 패턴은 이미지 데이터 변환이나 행렬 연산 등 실무에서도 자주 활용되므로, 로직을 이해하고 직접 구현해 보는 것이 좋습니다.