본문 바로가기
정리/알고리즘

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

by Hudini30 2022. 5. 16.

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

해당 문제는 start X, Y 좌표 및 end X,Y좌표를 통해 시계방향으로 회전 시키도록 하면서 회전하는 값들의 최소값을 구했습니다. 다른 공식이 있느지는 모르겠지만 입력받은 각 x1,y1, x2,y2 좌표를 통해 사각형 테두리 좌표를 각각 구할 수 있었고,
(x1, y1) -> (x1, y2), (x1, y2) -> (x2, y2), (x2, y2) -> (x2, y1), (x2,y1) -> (x1,y1) 순으로 각 좌표의 값들을 해당 방향으로 움직마지막 값은 temp에 넣은후 다음 방향의 첫번째 값으로 셋팅하면서 움직이게 하는 식으로 구현했습니다. 값을 움직이게 하기 위해 모든 대상 좌표를 방문하므로 그 값들의 최소값을 return 했습니다.

 

행렬 예시

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);
            }
        }
        for(int i =0; i< queries.length; i++) {
            answer[i] = rotate(queries[i], matrix);
        }
        return answer;
    }

    private int rotate(int[] query, int[][] matrix) {
        int startX = query[0] - 1;
        int startY = query[1] - 1;
        int endX = query[2] - 1;
        int endY = query[3] - 1;
        int temp = matrix[startX][startY];
        int min = temp;

        for (int i = startY + 1; i < endY; i++) {
            int temp1 = matrix[startX][i];
            matrix[startX][i] = temp;
            temp = temp1;
            min = Math.min(min, temp);
        }

        for (int i = startX; i < endX; i++) {
            int temp1 = matrix[i][endY];
            matrix[i][endY]= temp;
            temp = temp1;
            min = Math.min(min, temp);
        }

        for(int i = endY; i > startY; i--) {
            int temp1 = matrix[endX][i];
            matrix[endX][i] = temp;
            temp = temp1;
            min = Math.min(min, temp);
        }

        for(int i = endX; i >= startX; i--) {
            int temp1 = matrix[i][startY];
            matrix[i][startY]= temp;
            temp = temp1;
            min = Math.min(min, temp);
        }

        return min;
    }

댓글