[Algorithm]Toy Problem 22

안정태·2021년 5월 26일
2

Algorithm

목록 보기
22/50
post-thumbnail

문제 : rotateMatrix

2차원 N x N 배열을 시계 방향으로 90도 회전시킨 배열을 리턴해야 합니다.

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
console.log(rotatedMatrix[3][2]); // --> 8

문제의 접근

쉬운 문제다 그냥 배열 위치를 제 정의해주면 되는 문제다 다만 함정이 있다면 매트리스를 먼저 선언하고 거기에 값을 채워서는 안된다. 왜 그런지는 모르겠지만 값이 복사되서 중복값이 계속 튀어나왔고 무엇보다 이 문제는 N*M이 관건이다. 다시말해 정사각형 형태의 2차원 배열이 아니라는 것이다.

그렇다면 간단하다 배열을 만들어서 배열안에 넣어주기만 하면 된다.

/* const matrix = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
  [13, 14, 15, 16],
]; 를 넣는다 가정해보자.*/

const rotateMatrix = function (matrix)  {
  let result = [];

  for(let i = 0; i < matrix[0].length; i++) {
    let array = [] //새로운 빈 배열 선언
    for(let j = matrix.length-1; j >= 0; j--){
      array.push(matrix[j][i])
    } // [13, 9, 5, 1] 의 배열이 탄생 -> [14, 10, 6, 2]의 배열이 탄생 ...
    result.push(array) // 넣어준다.
  }

  return result
};

이 함수를 통해서 2차원 배열을 넣어주면 회전한 배열을 리턴해준다.

Advance

세로와 가로의 길이가 각각 M, N인 2차원 M X N 배열을 시계방향으로 90도씩 K번 회전시킨 배열을 리턴해 보세요. 회전수가 두 번째 입력으로 주어집니다.

위 함수를 정의했으니 그냥 k 값만 받아와서 k번 실행해주기만 하면 된다.

const rotateMatrix = function (matrix, k=1) {
  // TODO: 여기에 코드를 작성합니다.
  if(matrix.length === 0) return matrix;
  
  for(let i = 0; i < k; i++){ // k번 실시
    matrix = rotate(matrix);
  }

  return matrix
};

const rotate = (matrix) => {
  let result = [];

  for(let i = 0; i < matrix[0].length; i++) {
    let array = []
    for(let j = matrix.length-1; j >= 0; j--){
      array.push(matrix[j][i])
    }
    result.push(array)
  }

  return result
};

문제를 통해 생각해 볼 것

이런 문제는 이제 간단하게 풀 수 있는 것 같다. 하지만 여전히 DFS, BFS를 활용하는 부분은 많이 부족하다. 이 부분을 위주로 많이 생각해봐야겠다.

Reference

// 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;
};
profile
코딩하는 펭귄

0개의 댓글