566. Reshape the Matrix

2026-04-09
Leetcode 566번 풀이

문제

Reshape the Matrix

풀이

아이디어

총 원소 수가 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));