본문 바로가기

알고리즘

프로그래머스 - 행렬 테두리 회전하기(Java)

단순 구현문제 입니다.

 

행렬과 회전 좌표가 주어졌을 때, 회전할 때 마다 회전 하는 값들의 최소를 구하는 문제입니다.

단, 회전 할 때 테두리들의 값만 회전하고 중앙의 값은 회전하지 않습니다.

 

제가 구현한 방법은 간단합니다.

위 그림과 같이 3*3 행렬이 있다고 하겠습니다.

우선, 그림과 같이 테두리 끝부분에 있는 네 개의 값을 저장합니다.

저장을 하는 이유는, 회전할 때 값이 해당 위치에 덮어지기 때문입니다.

회전을 하고, 각 위치에 맞게 저장한 값을 넣으면 됩니다.

matrix[r1+1][c2] = t1;
matrix[r2][c2-1] = t2;
matrix[r2-1][c1] = t3;
matrix[r1][c1+1] = t4;

 

[구현 코드]

class Solution {
    private static int[][] matrix;

    public static int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];

        matrix = new int[rows + 1][columns + 1];

        for (int i = 1; i < rows + 1; i++) {
            for (int j = 1; j < columns + 1; j++) {
                matrix[i][j] = (i - 1) * columns + j;
            }
        }

        for (int i = 0; i < queries.length; i++) {
            int[] query = queries[i];
            answer[i] = rotate(query[0], query[1], query[2], query[3]);
        }

        return answer;
    }

    private static int rotate(int r1, int c1, int r2, int c2) {
        int min = Integer.MAX_VALUE;

        int t1, t2, t3, t4;

        // 1
        t1 = matrix[r1][c2];
        for(int i = c2; i>c1; i--){
            matrix[r1][i] = matrix[r1][i-1];
            min = Math.min(min, matrix[r1][i]);
        }

        // 2
        t2 = matrix[r2][c2];
        for(int i=r2; i>r1; i--){
            matrix[i][c2] = matrix[i-1][c2];
            min = Math.min(min, matrix[i][c2]);
        }

        // 3
        t3 = matrix[r2][c1];
        for(int i=c1; i<c2; i++){
            matrix[r2][i] = matrix[r2][i+1];
            min = Math.min(min, matrix[r2][i]);
        }

        // 4
        t4 = matrix[r1][c1];
        for(int i=r1; i<r2; i++){
            matrix[i][c1] = matrix[i+1][c1];
            min = Math.min(min, matrix[i][c1]);
        }
        
        matrix[r1+1][c2] = t1;
        matrix[r2][c2-1] = t2;
        matrix[r2-1][c1] = t3;
        matrix[r1][c1+1] = t4;

        // 값이 덮어졌으므로, 비교가 되지 않았음
        min = Math.min(min, t1);
        min = Math.min(min, t2);
        min = Math.min(min, t3);
        min = Math.min(min, t4);

        return min;
    }
}