코테/코드스테이츠[JS]

Toy 문제 22

반응형

문제

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

Advanced

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

출력

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

입출력 예시

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

 

수도코드(해석)

2차원 배열을 90도 회전시키고, 회전 횟수도 정해지면 그만큼 돌려서 출력하는 문제 입니다.

 

90도를 돌린다는 것은 

const matrix = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
  [13, 14, 15, 16],
];

을 예를 들어 본다면 

13, 14, 15, 16이 이중 배열중 한 배열안에 들어있지만 90도로 돌리게 되면 

2중 배열중 각각의 배열에 전부 하나씩 들어가게 됩니다. 즉 1, 5, 9, 13의 위치로 이동하게 되는 것입니다.

그러므로 13, 14, 15, 16을 각각 배열에 푸쉬해주고 그이어서 9, 10, 11, 12를 푸쉬해주는 2중반복문을 만들었습니다.

[13, 9 ...]

[14, 10 ...]

[15, 11 ...]

[16, 12 ...]

 

 

레퍼런스 코드는

얼마나 회전하냐에 따라 출력하는 리턴값을 설정해주고 배열이 직사각형인 경우도 있기에 고려를 해주었지만, 굳이 고려할 필요가 없는 경우라 생각해서 저는 고려하지 않고 짜도 가능했습니다. 그리고 회전시키는 반복문도 코드가 길지만 제가 짠 코드랑 일맥상통한것 같습니다.

 

코드

const rotateMatrix = function (matrix, k=1) {

// 빈 배열 입력시 빈 배열을 출력하는 코드
  if(matrix.length === 0) return matrix;

//rotate 함수
const rotate = (matrix) => {
  let result = [];
//90도를 돌리기 위한 2중 반복문
  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
};

// k의 숫자만큼 rotate 함수를 실행 시킵니다.
  for(let i = 0; i < k; i++){
    matrix = rotate(matrix);
  }
  
  return matrix
};

 

Reference 코드

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;
};
반응형

'코테 > 코드스테이츠[JS]' 카테고리의 다른 글

Toy 문제 24  (0) 2021.08.25
Toy 문제 23  (2) 2021.08.25
Toy 문제 21  (2) 2021.08.23
Toy 문제 20  (0) 2021.08.07
Toy 문제 19  (0) 2021.08.07