[プログラマー(Programmers)]2002 Dev-Martching:Webバックエンド開発者(上半期):回転マトリクスフレーム(java)


こんにちは!今日は回転マトリクスの枠線を解きます.この問題は2021 Dev-Metching:Webバックエンド開発者(上半期)から提起された.

質問リンク


https://programmers.co.kr/learn/courses/30/lessons/77485

問題を解く


1000 rotate関数の説明



上図は、回転関数の4つのfor文の回転順序を示しています.まず、初期数字「8」をtmp変数に入れ、14を8の位置に入れます.最後に、8を9の位置に入れ、Rotate関数は終了します.

完全なコード

class Solution {
    
    private int[][] matrix;
    
    public int[] solution(int rows, int columns, int[][] queries) {
        matrix = new int[rows][columns];
        int[] answer = new int[queries.length];
        int num = 1;
        
        // matrix 행렬 초기화
        for(int i = 0; i < rows; i++){
            for(int j = 0; j < columns; j++){
                matrix[i][j] = num;
                num++;
            }
        }
        
        for(int i = 0; i < queries.length; i++){ 
            answer[i] = rotate(queries[i]);
        }
        
        return answer;
    }
    
    private int rotate(int[] query){
        int r1 = query[0]-1; 
        int c1 = query[1]-1;
        int r2 = query[2]-1;
        int c2 = query[3]-1;
        
        int temp = this.matrix[r1][c1]; // 시작위치 값 임시저장
        int min = temp;                 // min값 초기화
        for(int i = r1; i < r2; i++){ // 문제설명 그림의 1번
            matrix[i][c1] = matrix[i+1][c1];
            if(min > matrix[i][c1]) min = matrix[i][c1];
        }
        
        for(int i = c1; i < c2; i++){ // 문제설명 그림의 2번
            matrix[r2][i] = matrix[r2][i+1];
            if(min > matrix[r2][i]) min = matrix[r2][i];
        }
        
        for(int i = r2; i > r1; i--){ // 문제설명 그림의 3번
            matrix[i][c2] = matrix[i-1][c2];
            if(min > matrix[i][c2]) min = matrix[i][c2];
        }
        
        for(int i = c2; i > c1; i--){ // 문제설명 그림의 4번
            matrix[r1][i] = matrix[r1][i-1];
            if(min > matrix[r1][i]) min = matrix[r1][i];
        }
        
        matrix[r1][c1+1] = temp; // 임시저장한 값 저장
        
        return min; //최솟값 반환
    }
    
}

に感銘を与える


どうやって解くか理解しています.論理は難しくないように見えます.再帰関数で解いてみたが,解く過程で太陽の光が強すぎて断念した.別の方法で解いてみようと思っていたのですが、一つの問題で時間がもったいないと思い、答えを探しに行きました.やはりアルゴリズム能力者は本当に多いです.
[参考資料]
https://dev-note-97.tistory.com/265