Algorithm problem-22

EBinY·2021년 12월 13일
0

AP - Algorithm Problem

목록 보기
18/55
  1. 문제
  • 2차원 N x N matrix를 90도 회전시킨 배열을 리턴하라
  • (Advanced) 정방형 외의 경우와 2회 이상의 회전값도 해결
  1. 시도
  • 빈 배열에 새로 담아서 리턴하기로 함
  • [1,2,3],
  • [4,5,6],
  • [7,8,9]를 입력받음
  • [7,4,1],
  • [8,5,2],
  • [9,6,3]을 출력해야 함
  • [x][y] => , x의 값은 y로 이동하며, y는 정 반대의 대척위치값 대체되어 x로 이동함
  • [0][0]=[0][2], [0][1]=[1][2], [0][2]=[2][2]
  • [1][0]=[0][1], [1][1]=[1][1], [1][2]=[2][1]
  • [2][0]=[0][0], [2][1]=[1][0], [2][2]=[2][0]
  • 0번 배열은 각 배열의 0번인덱스 값으로 이루어진다, 1번 배열은 각 배열의 1번값
  • 마지막 배열의 값이 0번....0번 배열의 값이 마지막 값이 된다
  • 즉, 새로운 배열의 0번 배열 값은 [2번배열의 0번, 1번배열의 0번, 0번배열의 0번]
  • 새로운 배열의 1번 배열 값은 [2번배열의 1번, 1번배열의 1번, 0번배열의 1번]
  • 중복문을 2번 써서 해결해보자
  • 정사각형 메트릭스에서만 제대로 작동함...
  1. 수도코드
const rotateMatrix = function (matrix) {
  // 새 메트릭스를 담아줄 빈 배열을 선언
  let result = [];
  // 최대 인덱스 값을 저장해 두고
  let max = matrix.length - 1;
  // 각 배열의 인덱스를 나열해야 하니까 첫번째 반복문은 0번부터 시작
  for (let i = 0; i <= max; i++) {
    // 배열에 배열을 담아줘야 하니까 배열 형식으로 담도록 하고
    let newArr = [];
    // 각 배열의 인덱스 값을 순서를 거꾸로 담아줘야 하니까 뒤집어서 끝번부터 0번까지로
    // max에서 1씩 작아져야 하니까 j가 0보다 크거나 같을때로 조건을 바꿔줘야 함
    for (let j = max; j >= 0; j--) {
      newArr.push(matrix[j][i])
    }
    // 담아준 새 배열을 결과 배열에 담으면
    result.push(newArr)
  }
  return result;
};
  1. 레퍼런스
const rotateMatrix = function (matrix, rotation) {
  // 최초 시도는 정사각형에서만 정상 작동하였고, 1회에만 대응하도록 되어 있음
  // matrix[m].length와 matrix.length를 가지고 방향에 맞게끔 대응시켜야 함
  // 회전수는 4바퀴를 돌 때마다 제자리이므로, 4를 나눈 나머지만큼 회전 시키도록 한다

  // 회전수가 undefined일 경우 1회로 설정한다
  if (rotation === undefined) rotation = 1;
  const R = matrix.length; //row
  if (R === 0) return []; //빈 배열일 경우를 걸러준다
  const C = matrix[0].length; //column
  rotation = rotation % 4;
  if (rotation === 0) return matrix; //4배수만큼 돌 경우, 제자리이므로
  //회전한 matrix을 저장할 빈 배열을 하나 선언
  const result = [];
  // 회전수가 홀수 일 경우, r과 c를 바꿔줘야 직사각형에도 대응 가능
  const rev = rotation % 2 === 1 ?[C, R] :[R, C];
  // rotation 수에 맞게 2중반복문으로 회전시킨 대응값을 넣어준다
  for (let row = 0; row < rev[0]; row++) {
    result[row] = [];
    for (let col = 0; col < rev[1]; col++) {
      // 1회전일 경우, Nrow에 matrix.length - col - 1한 값이 오고, Ncol에 row값이 오고
      if (rotation === 1) {
        result[row][col] = matrix[R - col - 1][row];
      }
      // 2회전일 경우, Nrow에 matrix.length - row - 1한 값, Ncol에 matrix[0].length - col - 1한 값
      else if (rotation === 2) {
        result[row][col] = matrix[R - row - 1][C - col - 1];
      }
      // 3회전일 경우, Nrow에 col, Ncol에 matrix[0].length - row - 1
      else if (rotation === 3) {
        result[row][col] = matrix[col][C - row - 1];
      }
    }
  }
  return result;
}

0개의 댓글

관련 채용 정보