x * y 행렬이 있을 때
행렬의 직사각형 모양의 범위를 여러번 선택해(queries), 테두리 부분에 있는 숫자들은 시계방향으로 회전시킴
첫 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있음
=> 아무회전 안했을 시 , i행 j열에 있는 숫자는 (((i-1) columns)+ j)
ex)
6행 6열에서 5행 2열 => 26
= ((5 - 1) 6) + 2 = 26
if) 6,6 행렬에서 [(2,2), (5,4)]를 기준으로 돌린다면
martix에서 행열로 따졌을 때,
열
행 (2,2) (2,3) (2,4)
(3,2) (3,4)
(4,2) (4,4)
(5,2) (5,3) (5,4)
를 돌려야한다
돌려지는 판을 board라 했을 때
1. {x행 = x1}이고 {y1 <= y열 < y2}이면 오른쪽으로 돌린다.
=> matrix[x1 - 1][y1 -1 <= 값 < y2 - 1] 까지 오른쪽으로 돌려야 함
[8, 9]
2. {x1 <= x행 < x2}이고 {y열 = y2}인 것은 아래쪽으로 돌린다.
=> matrix[x1 - 1 <= 값 < x2 - 1][y2 - 1] 까지 아래쪽으로 돌림
[8, 9, 10, 16, 22]
{x행 = x2}이고 {y1 < y열 <= y2}이면 왼쪽으로 돌린다.
=> matrix[x2 - 1][y1 - 1 < 값 <= y2 - 1] 까지 왼쪽으로 돌림
[8, 9, 10, 16, 22, 28, 27]
{x1 < x행 <= x2}이고 {y열 = y1}이면 위쪽으로 돌린다.
=> matrix[x1 < 값 <= x2 - 1][y1 - 1] 까지 위쪽으로 돌림
[8, 9, 10, 16, 22, 28, 27, 26, 20, 14]
board 마지막 index는 앞으로 옮김
[14, 8, 9, 10, 16, 22, 28, 27, 26, 20]
board에서 최솟값 구함
옮겨야하는 martix
martix의 1,1 = board의 0 index
matrix의 1,2 = board의 1 index
martix의 1,3 = board의 2 index
matrix의 2,3 = board의 3 index
matrix의 3,3 = board의 4 index
matrix의 4,3 = board의 5 index
matrix의 4,2 = board의 6 index
matrix의 4,1 = board의 7 index
matrix의 3,1 = board의 8 index
matrix의 2,1 = board의 9 index
로 대입
반복
function solution(rows, columns, queries) {
var answer = [];
let matrix = [];
for(let i = 1; i <= rows; i++) {
// row, columns에 따른 행렬 생성
let row = [];
for(let j = 1; j <= columns; j++) {
row.push( ((i - 1) * columns)+ j )
}
matrix.push(row);
}
for(query of queries) {
let x1 = query[0] -1; // index로 접근해야하니 -1
let x2 = query[2] -1;
let y1 = query[1] -1;
let y2 = query[3] -1;
let board = rotate(x1, y1, x2, y2, matrix)
answer.push(Math.min(...board) ) // 최솟값
// 돌려야하는 matrix에 대입
for(let i = y1; i < y2; i++) {
matrix[x1][i] = board.shift();
}
for(let i = x1; i < x2; i++) {
matrix[i][y2] = board.shift();
}
for(let i = y2; i > y1; i--) {
matrix[x2][i] = board.shift();
}
for(let i = x2; i > x1; i--) {
matrix[i][y1] = board.shift();
}
}
return answer;
}
function rotate(x1, y1, x2, y2, matrix) {
let board = [];
for(let i = y1; i < y2; i++) { // 오른쪽으로 돌려야하는 값
board.push(matrix[x1][i])
}
for(let i = x1; i < x2; i++) { // 아래쪽
board.push(matrix[i][y2])
}
for(let i = y2; i > y1; i--) { /// 왼쪽
board.push(matrix[x2][i])
}
for(let i = x2; i > x1; i--) { // 위쪽
board.push(matrix[i][y1])
};
board.unshift(board.pop()); // 마지막 index 앞으로
return board;
};