[Programmers]マトリクス境界の回転
問題の説明
行x columnsサイズのマトリクス.行列の数字は1からrows x columnsの順に1行です.この行列で長方形の範囲を複数回選択し、枠線部分の数値を時計回りに回転させます.各回転は4つの整数(x 1、y 1、x 2、y 2)で表され、その意味は以下の通りである.
この行列に回転(2,2,5,4)を適用すると、領域の枠線が時計回りに回転し、下図のように2行2列から5行4列になります.このとき、中央に15と21がある領域を回転させないように注意しましょう.
行列の縦長(行数)行、横長(列数)列、および回転リストをクエリーする場合は、各回転を配列に適用し、回転位置によって変更された数値の最小値を配列に順番に戻して解く関数を完了します.
せいげんじょうけん
-すなわち、回転がない場合、i行j列の数字は(i-1)x columns+jとなる.
ソースコード
import java.util.*;
class Solution {
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int[][] matrix = new int[rows][columns];
// 행렬 초기화
for(int i = 0;i < rows ; i++) {
for(int j = 0;j < columns;j++) {
matrix[i][j] = i*columns + j + 1;
System.out.println(i*rows + j + 1);
}
}
int index = 0;
for(int[] query : queries) {
int r1 = query[0] - 1, r2 = query[2] - 1, c1 = query[1] - 1, c2 = query[3] - 1;
int tmp = matrix[r1][c1]; // 시작 위치 값 저장
int min = tmp;
// 반시계방향 순서로 값 덮어씌움
for(int i = r1+1;i <= r2; i++) {
matrix[i-1][c1] = matrix[i][c1];
min = Math.min(min, matrix[i-1][c1]);
}
for(int i = c1+1;i <= c2; i++) {
matrix[r2][i-1] = matrix[r2][i];
min = Math.min(min, matrix[r2][i-1]);
}
for(int i = r2-1;i >= r1; i--) {
matrix[i+1][c2] = matrix[i][c2];
min = Math.min(min, matrix[i+1][c2]);
}
for(int i = c2-1;i >= c1+1; i--) {
matrix[r1][i+1] = matrix[r1][i];
min = Math.min(min, matrix[r1][i+1]);
}
matrix[r1][c1+1] = tmp;
min = Math.min(min, matrix[r1][c1+1]);
answer[index] = min; index += 1;
}
return answer;
}
}
Reference
この問題について([Programmers]マトリクス境界の回転), 我々は、より多くの情報をここで見つけました https://velog.io/@minwest/Programmers-행렬-테두리-회전하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol