[PG_LV2] 행렬 테두리 회전하기

Pavel_Dmr·2022년 8월 6일

Programmers LEVEL 2

목록 보기
5/5

행렬을 정해진 조건으로 회전 후 범위 내에 최소값을 담은 배열을 리턴합니다

예시

int rows = 6;
int columns = 6;

int[][] queries =  {{2,2,5,4},{3,3,6,6},{5,1,6,3}};

가로,세로 [2칸,2칸]에서 가로,세로 [5칸,4칸]까지의 범위에서 테두리 회전 했을 때, 최소값은 8

가로,세로 [3칸,3칸]에서 가로,세로[6칸,6칸] 까지의 범위에서 테두리 회전 했을 때, 최소값은 10

가로,세로 [5칸,1칸]에서 가로,세로[6칸,3칸] 까지의 범위에서 테두리 회전 했을 때, 최소값은 25

최소값 배열을 리턴합니다.
return {8,10,25}

코드 작성시엔 인덱스값을 기준으로 회전 해야하기에 값에 접근할때 -1합니다.

package PG_Lv_2.행렬테두리회전_009;

public class Solution
{
    int[][] matrix;

    public int[] solution(int rows, int columns, int[][] queries)
    {
        this.matrix = new int[rows][columns]; // 행렬 생성
        int[] answer = new int[queries.length]; // 정답 배열

        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에 저장
            answer[i] = rotate(queries[i]);
        }

        return answer;
    }

    public int rotate(int[] query)
    {
        // 인덱스 값을 기준으로 회전 해야 하기 떄문에 -1
        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++)
        { // 왼쪽 회전
            this.matrix[i][c1] = this.matrix[i + 1][c1];
            if (min > this.matrix[i][c1])
                min = this.matrix[i][c1];
        }
        for (int i = c1; i < c2; i++)
        { // 아래 회전
            this.matrix[r2][i] = this.matrix[r2][i + 1];
            if (min > this.matrix[r2][i])
                min = this.matrix[r2][i];
        }
        for (int i = r2; i > r1; i--)
        { // 오른쪽 회전
            this.matrix[i][c2] = this.matrix[i - 1][c2];
            if (min > this.matrix[i][c2])
                min = this.matrix[i][c2];
        }
        for (int i = c2; i > c1; i--)
        { // 위 회전
            this.matrix[r1][i] = this.matrix[r1][i - 1];
            if (min > this.matrix[r1][i])
                min = this.matrix[r1][i];
        }
        this.matrix[r1][c1 + 1] = temp; // 임시저장한 값 저장

        return min; // 해당 회전에서의 최소값을 리턴
    }

}

profile
노는게 좋아

0개의 댓글