プログラマ-回転マトリクス境界
14901 ワード
x*yマトリクスが存在する場合
マトリクスの矩形範囲(query)を複数回選択し、枠線の数字を時計回りに回転させる
最初の行列では、数字は1から1まで水平方向に増加します.
=>回転がない場合、i行j列の数字は((i-1)columns)+j)
ex)
6行6列から5行2列=>26
= ((5 - 1) 6) + 2 = 26
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)
ねじる
ターンテーブルを運ぶと
1.{x行=x 1},{y 1<=y列=>行列[x 1-1][y 1-1<=値[8, 9]
2.{x 1<=x行=>マトリクス[x 1-1<=値[8, 9, 10, 16, 22]
{x行=x 2},{y 1=>行列[x 2-1][y 1-1<値<=y 2-1]左折
[8, 9, 10, 16, 22, 28, 27]
{x 1=>matrix[x 1<値<=x 2-1][y 1-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インデックス
マトリックスの1,2=プレートの1インデックス
martixの1、3=boardの2インデックス
マトリックスの2,3=プレートの3 index
行列の3,3=boardの4インデックス
マトリックスの4,3=プレートの5 index
マトリックスの4,2=プレートの6 index
行列の4,1=boardの7インデックス
行列の3,1=boardの8インデックス
マトリックスの2,1=プレートの9個のインデックス
代入
繰り返し
マトリクスの矩形範囲(query)を複数回選択し、枠線の数字を時計回りに回転させる
最初の行列では、数字は1から1まで水平方向に増加します.
=>回転がない場合、i行j列の数字は((i-1)columns)+j)
ex)
6行6列から5行2列=>26
= ((5 - 1) 6) + 2 = 26
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)
ねじる
ターンテーブルを運ぶと
1.{x行=x 1},{y 1<=y列
2.{x 1<=x行
{x行=x 2},{y 1
[8, 9, 10, 16, 22, 28, 27]
{x 1
[8, 9, 10, 16, 22, 28, 27, 26, 20, 14]
[14, 8, 9, 10, 16, 22, 28, 27, 26, 20]
boardから最高価格を取得
移行が必要なmartix
martixの1,1=boardの0インデックス
マトリックスの1,2=プレートの1インデックス
martixの1、3=boardの2インデックス
マトリックスの2,3=プレートの3 index
行列の3,3=boardの4インデックス
マトリックスの4,3=プレートの5 index
マトリックスの4,2=プレートの6 index
行列の4,1=boardの7インデックス
行列の3,1=boardの8インデックス
マトリックスの2,1=プレートの9個のインデックス
代入
繰り返し
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;
};
Reference
この問題について(プログラマ-回転マトリクス境界), 我々は、より多くの情報をここで見つけました https://velog.io/@ollabu3/프로그래머스-행렬-테두리-회전하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol