[프로그래머스] 행렬 테두리 회전하기 (자바)

HeavyJ·2023년 1월 29일
0

프로그래머스

목록 보기
5/7

행렬 테두리 회전하기

문제풀이

이 문제는 회전 테두리에만 해당하는 숫자들이 한 칸씩 이동하는 배열을 만들어 최소값을 찾는 문제다 .
한 칸씩 이동된 이차원 배열을 만드려면 각 꼭지점의 좌표를 선언해서 그 좌표에 해당하는 테두리만 이동한다는 개념으로 접근해야 한다.
먼저, 상단의 숫자들을 쭉 오른쪽으로 밀어서 덮어쓴다.
그리고 좌측의 숫자를 위로 밀어서 덮어쓴다.
우측 숫자들도 마찬가지로 쭉 아래로 덮어쓰고
하단 숫자들도 왼쪽으로 밀어서 덮어쓴다.
위 과정을 모두 진행했을 때 예제에서는 10번자리에서 아래로 한 칸 내려간 자리에 10번이 들어가야 하지만 9번이 들어가게 된다.
여기서 9번을 10번으로 다시 덮어쓰는 과정까지 진행하면 테두리에 맞게 행렬이 올바르게 이동된 형태가 된다.

이 과정을 구현된 코드로 보자.

구현코드

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

        // rows * column 크기인 행렬 있다
        // 행렬에는 1부터 row * column까지의 숫자가 한 줄씩 순서대로 적혀있다.
        // 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 한다
        // 각 회전은 x1,y1,x2,y2인 정수 4개로 표현, 그 의미는 다음과 같다
        // x1행 y1열부터 x2행 y2열까지의 영역에 해당하는 직사각형에서 테두리에 있는 수자들을 한 칸씩 시계 방향으로 회전

        // 행렬의 세로 길이 rows, 가로 길이 columns 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤,

        // rows, columns
        // 처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있다
        // queries 행의 개수는 1이상 만 이하

        int[][] arr = new int[rows][columns];
        int cnt = 1;

        // 행렬안에 값을 1부터 rows*columns 만큼 순서대로 입력하기
        for(int i = 0; i<rows; i++){
            for(int j=0; j<columns; j++){
                arr[i][j] = cnt;
                cnt++;
            }
        }

        // 회전 테두리 좌표 선언
        int startRow, startCol, endRow, endCol, min= 0;

        for(int i = 0; i<queries.length; i++){

            // 회전 테두리 좌표를 위한 x,y값 -1 해주기
            startRow = queries[i][0]-1;
            startCol = queries[i][1]-1;
            endRow = queries[i][2]-1;
            endCol = queries[i][3]-1;

            // arr[startRow][endCol]이 arr[startRow+1][endCol]로 이동할 때 사용할 temp값
            int temp = arr[startRow][endCol];
            // 최소값은 회전 범위 안에 존재하는 temp로 설정하기
            min = temp;

            // 상단 우측으로 이동하는 경우
            for(int j = endCol; j>=startCol+1; j--){
                arr[startRow][j] = arr[startRow][j-1];

                if(min > arr[startRow][j]){
                    min = arr[startRow][j];
                }
            }

            // 좌측 상단으로 이동하는 경우
            for(int j = startRow; j<=endRow-1; j++){

                arr[j][startCol] = arr[j+1][startCol];

                if(min>arr[j][startCol]){
                    min = arr[j][startCol];
                }
            }

            // 하단 좌측으로 이동하는 경우
            for(int j = startCol; j<=endCol-1; j++){

                arr[endRow][j] = arr[endRow][j+1];

                if(min>arr[endRow][j]){
                    min = arr[endRow][j];
                }
            }

            // 우측 하단으로 이동하는 경우
            for(int j = endRow; j>=startRow+1; j--){

                arr[j][endCol] = arr[j-1][endCol];

                if(min > arr[j][endCol]){
                    min = arr[j][endCol];
                }
            }

            arr[startRow+1][endCol] = temp;

            answer[i] = min;

        }

        return answer;
    }
}

😃😃

profile
There are no two words in the English language more harmful than “good job”.

0개의 댓글