본문 바로가기
알고리즘 문제풀이/프로그래머스

[프로그래머스] 행렬 테두리 회전하기 - 자바(Java), 구현, 2021 Dev-Matching: 웹 백엔드(상반기)

by jeonghaemin 2021. 10. 21.
728x90

문제

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

풀이 코드 - 구현

풀이 과정

  1. 좌측 상단 테두리 (x1, y1) 위치의 값을 저장해 놓는다.
  2. 행렬의 좌측 테두리 -> 하단 테두리 -> 우측 테두리 -> 상단 테두리 순으로 시계 방향으로 행렬의 값을 한칸씩 이동시킨다.
  3. 저장해 두었던 좌측 상단 테두리 값을 (x1, y1+1) 위치에 저장한다.
class Solution {
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];

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

        int num = 1;
        for(int i = 1 ; i <= rows; i++) {
            for(int j = 1;  j <= columns; j++) {
                board[i][j] = num++;
            }
        }

        for(int i = 0 ; i < queries.length; i++) {
            int x1 = queries[i][0];
            int y1 = queries[i][1];
            int x2 = queries[i][2];
            int y2 = queries[i][3];

            int temp = board[x1][y1];

            int min = temp;

            //좌측 테두리 이동
            for(int j = x1; j < x2; j++) {
                board[j][y1] = board[j+1][y1];
                min = Math.min(min, board[j][y1]);
            }

            //하단 테두리 이동
            for(int j = y1; j < y2; j++) {
                board[x2][j] = board[x2][j+1];
                min = Math.min(min, board[x2][j]);
            }

            //우측 테두리 이동
            for(int j = x2; j > x1; j--) {
                board[j][y2] = board[j-1][y2];
                min = Math.min(min, board[j][y2]);
            }


            //상단 테두리 이동
            for(int j = y2; j > y1; j--) {
                board[x1][j] = board[x1][j-1];
                min = Math.min(min, board[x1][j]);
            }

            board[x1][y1+1] = temp;

            answer[i] = min;
        }

        return answer;
    }
}

댓글