hsskey / algorithm-practice

🧑‍💻 Solving algorithms to level up
0 stars 0 forks source link

Rotate Matrix #14

Open hsskey opened 1 month ago

hsskey commented 1 month ago

Rotate metrix

N x N 행렬로 표현된 이미지를 90도 회전시키는 메서드를 작성하라. 각 픽셀은 4바이트로 표현되며, 부가적인 행렬을 사용하지 않고 해결해야 한다.

📝 제약조건

💡 예시

문제 해결 과정

Step 1: 문제 이해하기

Step 2: 접근 방법

Step 3: 코드 설계

  1. 행렬 전치 (transpose)
    • 대각선을 기준으로 원소 교환
  2. 각 행 뒤집기
    • 각 행의 첫 번째 원소와 마지막 원소부터 시작해 안쪽으로 이동하며 교환

Step 4: 코드 구현

function rotateMatrix(m) {
  const n = m.length;

  // 1. 전치 (transpose)
  for (let i = 0; i < n; i++) {
    for (let j = i; j < n; j++) {
      [m[i][j], m[j][i]] = [m[j][i], m[i][j]];
    }
  }

  // 2. 각 행 뒤집기
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n / 2; j++) {
      [m[i][j], m[i][n-1-j]] = [m[i][n-1-j], m[i][j]];
    }
  }

  return m;
}

// 테스트
console.log(rotateMatrix([[1,2,3],[4,5,6],[7,8,9]]));
console.log(rotateMatrix([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]));

Step 5: 문제풀이 형상화

  1. 전치 (transpose) 과정:

    [1 2 3]    [1 4 7]
    [4 5 6] -> [2 5 8]
    [7 8 9]    [3 6 9]
  2. 각 행 뒤집기:

    [1 4 7]    [7 4 1]
    [2 5 8] -> [8 5 2]
    [3 6 9]    [9 6 3]

이 방법을 통해 추가 메모리 사용 없이 효율적으로 행렬을 90도 회전시킬 수 있습니다.

hsskey commented 1 month ago

transposed 처리를 새로운 변수배열로 받아 개선한 풀이

function rotateMatrix(m){
    const rows = m.length
    const cols = m[0].length
    //1. transpose
    const transposed = Array.from({length: cols}, () => new Array(rows));
    for (let i = 0; i < rows; i++) {
      for (let j = 0; j < cols; j++) {
        transposed[j][i] = m[i][j];
      }
    }
    //2. reverse 
    for(let row of transposed){
    }

    return transposed;

  }

  console.log(rotateMatrix([[1,2,3],[4,5,6],[7,8,9]]),
              rotateMatrix([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]));