상세 컨텐츠

본문 제목

JavaScript Algoritm - rotateMatrix

Programming Language/JavaScript

by Yongari 2023. 2. 2. 13:47

본문

 

문제설명 : 

 

2차원 N x N 배열을 시계 방향으로 90도 회전시킨 배열을 리턴해야 합니다. 더 나아가서는 90도씩 K번 회전시킨 배열도 리턴해야합니다.  회전수는 함수의 두번째 입력으로 주어집니다. 

 

입력

인자 1 : matrix

  • 가로 길이(matrix[i].length)와 세로 길이(matrix.length)가 모두 N인 2차원 배열
  • matrix[i][j]는 number 타입

 

인자 2 : rotateNum
   회전수로 생각하면 된다.    

출력

  • 2차원 배열을 리턴해야 합니다.

 

 

처음 접근했던 코드

처음 내가 접근했던 코드, 기본 테스트는 통과했지만 고급 테스트로 갈수록 코드가 통과되지 않았다. 
지금 봐도 지저분하지만 우선 공유해본다. 

const rotateMatrix0 = function (matrix) {
    if ( !matrix.length){
        return [];
    }
    const result =[];
    let m = matrix[0].length
    let n = matrix.length
    for (let row =0; row <m; row++){
     result.push([])
    }
    if (m == n ){
        for (let i=0; i < m; i++){
            for(let j=n-1; j >= 0; j--){
                result[i].push(matrix[j][i])
            }
        }
    }
    if ( m > n ){
        for (let i=0; i < m; i++){
            //console.log("i",i)
            for(let j=n-1; j >= 0; j--){
                console.log("i,j",i,j)
                result[i].push(matrix[j][i])
            }
        }
    }
    return result
};

 

 

풀이코드 설명 
회전수가 어떻게 오더라도 테스트를 전부 통과한 코 드다.

// 회전수가 없을 때 더 간략히 풀 수 있는 코드
// const rotateMatrix = function (matrix) {
//   const N = matrix.length;
//   const M = matrix[0] && matrix[0].length;
//   let output = [];

//   for (let row = 0; row < M; row++) {
//     output[row] = [];
//     for (let col = 0; col < N; col++) {
//       output[row][col] = matrix[N - col - 1][row];
//     }
//   }

//   return output;
// };





const rotateMatrix = function (matrix, rotateNum = 1) {
  // rotateNum 이 0일 수 있으므로 아래와 같은 초기화는 지양해야 함
  // rotateNum = rotateNum || 1
  const N = matrix.length;
  // 빈 배열을 입력받을 수 있다.
  const M = matrix[0] && matrix[0].length;

  rotateNum = rotateNum % 4;
  // 회전하지 않는다.
  if (rotateNum === 0) return matrix;

  const rotated = [];
  // 홀수번 회전 시 M x N, 짝수번 회전 시 N x M
  const RC = rotateNum % 2 === 1 ? [M, N] : [N, M];

  for (let row = 0; row < RC[0]; row++) {
    rotated[row] = [];
    for (let col = 0; col < RC[1]; col++) {
      if (rotateNum === 1) rotated[row][col] = matrix[N - col - 1][row];
      else if (rotateNum === 2)
        rotated[row][col] = matrix[N - row - 1][M - col - 1];
      else rotated[row][col] = matrix[col][M - row - 1];
    }
  }

  return rotated;
};

 

 


입출력 예시

const matrix = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
  [13, 14, 15, 16],
];
console.log(matrix[0][0]); // --> 1
console.log(matrix[3][2]); // --> 15

const rotatedMatrix = rotateMatrix(matrix);
console.log(rotatedMatrix[0][0]); // --> 13

const input = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
  ];
const input2 = []
rotateMatrix(input2)
rotateMatrix(input)

관련글 더보기