본문 바로가기

알고리즘/프로그래머스

[프로그래머스][JAVA] Lv.2 / 행렬 테두리 회전하기

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

풀이 순서

  1. 배열 초기화 (초기 Board 1~ n*n)
  2. 취향상 0기반 index로 계산
  3. 회전시키며 최소값 갱신하여 반환
    1. 결국 우리가 변경해야할 행렬의 테두리의 방향은 ( →, ↓, ←, ↑ ) 4방향이다. 방향 순서는 취향에 맡깁니다.
    2. 경계값에 닿으면 방향을 변경해 다시 탐색하는 방식
    3. 이전 좌표의 정보를 현재 좌표에 덮어씌운다. (이전 좌표의 정보는 현재 좌표 Value로 갱신)
class Solution {
   private int[][] DIRECTION = {
            {0, 1}, // 우
            {1, 0}, // 하
            {0, -1}, // 좌
            {-1, 0} // 상
    };
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        int[][] board = makeBoard(rows, columns);
        for (int i = 0; i < queries.length; i++) {
            int x1 = queries[i][0] - 1; // 0-Index 기반 변경
            int y1 = queries[i][1] - 1;
            int x2 = queries[i][2] - 1;
            int y2 = queries[i][3] - 1;

            answer[i] = rotate(board, x1, y1, x2, y2);
        }

        return answer;
    }

    private int rotate(int[][] board, int x1, int y1, int x2, int y2) {
        int tmp = board[x1][y1];
        int minValue = tmp;
        int x = x1, y = y1;

        for (int i = 0; i < DIRECTION.length; i++) {
            while (true) {
                int nx = x + DIRECTION[i][0];
                int ny = y + DIRECTION[i][1];

                if (nx < x1 || nx > x2 || ny < y1 || ny > y2) {
                    break;
                }

                // 값 변경
                int v = board[nx][ny];
                board[nx][ny] = tmp;
                tmp = v;

                if (tmp < minValue) {
                    minValue = tmp;
                }

                x = nx;
                y = ny;
            }
        }

        return minValue;
    }

    private int[][] makeBoard(int rows, int columns) {
        int[][] board = new int[rows][columns];
        int value = 1;
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                board[i][j] = value++;
            }
        }
        return board;
    }
}