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

urzi·2022년 4월 4일
0

PS

목록 보기
13/36

문제

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

알고리즘

구현, 행렬

풀이

가로행
세로열
가로와 세로를 헷갈리면 안된다.
행렬인 경우 x,y라면 x행(가로)에 y열(세로)
3행이면 3번째 가로행이고, 2열이면 2번쨰 세로열이다.

[예제 구현]
1. 맨 처음에 값을 임시값으로 저장시켜준다.
2. 시작행부터 끝 행까지 현재 값을 다음 행 값으로 채운다.
3. 시작 세로열부터 끝 세로열까지 현재 값을 다음 세로열 값으로 채운다.
4. 끝 가로행부터 시작 가로행까지 현재 값을 이전 가로행 값으로 채운다.
5. 끝 세로열부터 시작 세로열까지 현재 값을 이전 세로열 값으로 채운다.
6. 2번에서 5번을 수행하면서 최소값을 계속 저장해준다.
6. 마지막으로 시작 값을 다음 세로열 값으로 넣어준다.

코드

class Solution {
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        int number = 1;
        int[][] grid = new int[rows][columns];

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                grid[i][j] = number++;
            }
        }

        for (int i = 0; i < queries.length; i++) {
            answer[i] = rotation(queries[i], grid);
        }

        

        return answer;
    }

    private int rotation(int[] query, int[][] grid) {
        
        int r1 = query[0] - 1;
        int c1 = query[1] - 1;
        int r2 = query[2] - 1;
        int c2 = query[3] - 1;

        // 시작위치 값 임시저장
        int temp = grid[r1][c1];

        // min값 초기화
        int min = temp;

        // 왼쪽에서 오른쪽
        for (int i = r1; i < r2; i++) {
            grid[i][c1] = grid[i + 1][c1];
            min = Math.min(min, grid[i][c1]);
        }

        // 오른쪽에서 밑으로
        for (int i = c1; i < c2; i++) {
            grid[r2][i] = grid[r2][i + 1];
            min = Math.min(min, grid[r2][i]);
        }

        // 밑에서 왼쪽으로
        for (int i = r2; i > r1; i--) {
            grid[i][c2] = grid[i - 1][c2];
            min = Math.min(min, grid[i][c2]);
        }

        // 밑에서 왼쪽 위로
        for (int i = c2; i > c1; i--) { // 회전의 4번
            grid[r1][i] = grid[r1][i - 1];
            min = Math.min(min, grid[r1][i]);
        }

        // 원래 값을 한칸 오른쪽으로 이동
        grid[r1][c1 + 1] = temp;

        return min;
    }
}
profile
Back-end Developer

0개의 댓글