[Programmers]マトリクス境界の回転


問題の説明


行x columnsサイズのマトリクス.行列の数字は1からrows x columnsの順に1行です.この行列で長方形の範囲を複数回選択し、枠線部分の数値を時計回りに回転させます.各回転は4つの整数(x 1、y 1、x 2、y 2)で表され、その意味は以下の通りである.
  • x 1行y 1列からx 2行y 2列に対応する領域の矩形では、枠の数字を時計回りに回転させる.
  • 次に、6 x 6サイズマトリクスの例を示します.

    この行列に回転(2,2,5,4)を適用すると、領域の枠線が時計回りに回転し、下図のように2行2列から5行4列になります.このとき、中央に15と21がある領域を回転させないように注意しましょう.

    行列の縦長(行数)行、横長(列数)列、および回転リストをクエリーする場合は、各回転を配列に適用し、回転位置によって変更された数値の最小値を配列に順番に戻して解く関数を完了します.

    せいげんじょうけん

  • 行は2または100以下の自然数です.
  • 列は2以上100以下の自然数です.
  • が始まると、行列には1から1までの横方向の数字が増えていると書かれています.
    -すなわち、回転がない場合、i行j列の数字は(i-1)x columns+jとなる.
  • クエリのロー数(回転数)は10000より大きい.
  • クエリの各ローは、4つの整数[x 1、y 1、x 2、y 2]である.
  • x 1行のy 1列からx 2行のy 2列まで時計回りに領域の枠を回転させる.
  • 1≦x 1すべての回転は順番に行われます.
  • 例えば、2番目の回転の答えは、1番目の回転を実行し、その状態で2番目の回転を実行したときに、移動する数字の最大値を求めることである.

    ソースコード

    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;
        }
    }