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차원 배열을 넣어주면 회전한 배열을 리턴해준다.
세로와 가로의 길이가 각각 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를 활용하는 부분은 많이 부족하다. 이 부분을 위주로 많이 생각해봐야겠다.
// 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;
};