566. Reshape the Matrix
2026-04-09
Leetcode 566번 풀이
문제
풀이
아이디어
총 원소 수가 r * c === m * n을 만족하지 않으면 reshape가 불가능하므로 원본을 그대로 반환한다.
가능한 경우, r개의 빈 행을 만들어두고 원본 행렬을 행 우선(row-major) 순서로 순회하며 원소를 채운다. 현재 행이 c개로 가득 차면 다음 행으로 넘어가는 방식으로 reshape를 구현한다.
코드
function matrixReshape(mat: number[][], r: number, c: number): number[][] {
const m = mat.length;
const n = mat[0].length;
if (r * c !== m * n) return mat; // reshape가 불가능한 경우. 문제를 꼼꼼히 읽읍시다.. 5분은 다시 본듯
const answer: number[][] = Array.from({ length: r }, () => []);
let row = 0;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (answer[row].length === c) row++;
answer[row].push(mat[i][j]);
}
}
return answer;
}시간 / 공간 복잡도
- 시간 복잡도: O(m * n) — 입력 행렬의 모든 원소를 한 번씩 순회
- 공간 복잡도: O(r * c) — 결과 행렬 저장 공간 (= O(m * n))
여담
mat.flat()으로 1차원 배열로 펼친 뒤 slice로 잘라내는 방식도 있다. 코드는 간결하지만 중간 배열을 추가로 생성한다는 트레이드오프가 있다.
const flat = mat.flat();
return Array.from({ length: r }, (_, i) => flat.slice(i * c, i * c + c));