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

2023. 12. 2. 01:02알고리즘/구현

728x90
반응형

문제

행렬 테두리 회전하기


풀이

단순 구현을 해도 풀리는 문제였다.

 

  1. 주어지는 행, 열 크기에 맞춰 board를 만들어주고
  2. queries의 (x1, y1, x2, y2) 좌표에 맞게 시계방향으로 값을 swap해준다.
  3. 이때 각 query별 값의 최솟값을 찾는다.

코드

import java.util.*;

class Solution {

    int[][] board;

    public int[] solution(int rows, int columns, int[][] queries) {
        setBoard(rows, columns);

        int index = 0;
        int[] answer = new int[queries.length];
        
        for (int[] query : queries) {
            int x1 = query[0] - 1;
            int y1 = query[1] - 1;
            int x2 = query[2] - 1;
            int y2 = query[3] - 1;

            int min = spin(x1, y1, x2, y2);
            answer[index++] = min;
        }

        return answer;
    }

    private void setBoard(int rows, int columns) {
        board = new int[rows][columns];

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

    private int spin(int x1, int y1, int x2, int y2) {
        int cx = x1;
        int cy = y1;
        int pre = board[cx][cy];
        int min = pre;

        //(x1, y1) -> (x1, y2)
        while (cy < y2) {
            int temp = board[cx][cy + 1];
            board[cx][cy + 1] = pre;
            pre = temp;
            min = Math.min(min, pre);
            cy++;
        }

        //(x1, y2) -> (x2, y2)
        while (cx < x2) {
            int temp = board[cx + 1][cy];
            board[cx + 1][cy] = pre;
            pre = temp;
            min = Math.min(min, pre);
            cx++;
        }

        //(x2, y2) -> (x2, y1)
        while (cy > y1) {
            int temp = board[cx][cy - 1];
            board[cx][cy - 1] = pre;
            pre = temp;
            min = Math.min(min, pre);
            cy--;
        }

        //(x2, y1) -> (x1, y1)
        while (cx > x1) {
            int temp = board[cx - 1][cy];
            board[cx - 1][cy] = pre;
            pre = temp;
            min = Math.min(min, pre);
            cx--;
        }

        return min;
    }
}
728x90
반응형

'알고리즘 > 구현' 카테고리의 다른 글

[백준/C++] 4889번 안정적인 문자열  (0) 2021.03.24
[백준/C++] 10799번 쇠막대기  (0) 2021.03.23
[백준/C++] 2504번 괄호의 값  (0) 2021.03.23
[백준/C++] 5430번 AC  (0) 2021.03.22
[백준/C++] 18258번 큐 2  (0) 2021.03.21