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

최지홍·2022년 3월 31일
0

프로그래머스

목록 보기
12/15

문제 출처: https://programmers.co.kr/learn/courses/30/lessons/77485


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

        int num = 1;

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

        for (int i = 0; i < queries.length; i++) {
            answer[i] = rotate(matrix, queries[i][0] - 1, queries[i][1] - 1, queries[i][2] - 1, queries[i][3] - 1);
        }
        
        return answer;
    }
    
    private int rotate(int[][] matrix, int y1, int x1, int y2, int x2) {
        int[][] directions = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }, };

        int first = matrix[y1][x1];
        int dy = y1 + 1;
        int dx = x1;

        int index = 0;

        int min = Integer.MAX_VALUE;

        matrix[y1][x1] = matrix[dy][dx];
        min = Math.min(min, matrix[dy][dx]);

        while (dy != y1 || dx != x1 + 1) {
            int tempY = dy + directions[index][0];
            int tempX = dx + directions[index][1];

            if (tempY >= y1 && tempY <= y2 && tempX >= x1 && tempX <= x2) {
                matrix[dy][dx] = matrix[tempY][tempX];
                min = Math.min(min, matrix[tempY][tempX]);
                dy = tempY;
                dx = tempX;
            } else {
                index++;
            }
        }

        matrix[y1][x1 + 1] = first;
        min = Math.min(min, first);

        return min;
    }
}

  • 배열을 회전시키는 문제는 나올 때마다 헷갈리는 것 같다.
  • 핵심 로직은, 시계 방향으로 회전하므로 연산은 시계 반대 방향으로 진행한다.
  • 가장 처음 값을 먼저 따로 저장해둔다.
  • 4방 탐색의 순서는 아래, 오른쪽, 위, 왼쪽이다. 이 순서로 다음 값을 살펴 현재 자리로 옮긴다.
  • 종료조건인 while 문의 조건 처리를 처음에 &&로 주어 값이 나오지 않았다. 잘 살펴야할 부분인 것 같다.
  • 값의 변경이 있는 것들 중 최솟값을 찾아야 하므로 메서드를 호출하여 도출하였다.
profile
백엔드 개발자가 되자!

0개의 댓글

관련 채용 정보