- 문제
- 2차원 N x N matrix를 90도 회전시킨 배열을 리턴하라
- (Advanced) 정방형 외의 경우와 2회 이상의 회전값도 해결
- 시도
- 빈 배열에 새로 담아서 리턴하기로 함
- [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번 써서 해결해보자
- 정사각형 메트릭스에서만 제대로 작동함...
- 수도코드
const rotateMatrix = function (matrix) {
let result = [];
let max = matrix.length - 1;
for (let i = 0; i <= max; i++) {
let newArr = [];
for (let j = max; j >= 0; j--) {
newArr.push(matrix[j][i])
}
result.push(newArr)
}
return result;
};
- 레퍼런스
const rotateMatrix = function (matrix, rotation) {
if (rotation === undefined) rotation = 1;
const R = matrix.length;
if (R === 0) return [];
const C = matrix[0].length;
rotation = rotation % 4;
if (rotation === 0) return matrix;
const result = [];
const rev = rotation % 2 === 1 ?[C, R] :[R, C];
for (let row = 0; row < rev[0]; row++) {
result[row] = [];
for (let col = 0; col < rev[1]; col++) {
if (rotation === 1) {
result[row][col] = matrix[R - col - 1][row];
}
else if (rotation === 2) {
result[row][col] = matrix[R - row - 1][C - col - 1];
}
else if (rotation === 3) {
result[row][col] = matrix[col][C - row - 1];
}
}
}
return result;
}