[2021 Dev-Matching] 행렬 테두리 회전하기

2022. 3. 23. 13:53PS/Programmers

 

[문제 접근법]

- 실제 2차원 배열에 대한 구현 능력을 물어보는 문제인거 같다. 나는 큐를 활용하여 시계방향으로 배열을 옮기는 로직을 구현 하였다.

맨위 - 오른쪽 - 맨아래 - 맨왼쪽 순으로 배열을 옮기면서 진행하였음

 


[구현 1]

1. 2차원 행렬을 만든다

2. 위 - 오른쪽 - 아래 - 왼쪽 순으로 배열을 옮기는 과정을 거침(큐에 이전값을 넣어서 배열값을 변경)

3. 그리고 각 변환마다 최소값을 찾는다

 

import java.util.*;

class Solution {
    
      //2차원 배열 테두리 만들기
    public int[][] makeMatrix(int rows, int columns) {
        int[][] matrix = new int[rows][columns];

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

        }

        return matrix;
    }


    //시계 방향으로 회전
    public int doRotate(int[][] matrix, int x1, int y1, int x2, int y2) {
        int min = matrix[x1][y1]; //최소값
        int tmp = 0;
        Queue<Integer> que=new LinkedList<>();
        que.add(matrix[x1][y1]);

        //윗줄 옮기기(가로, y축 증가)
        for (int y = y1+1; y <= y2; y++) {
            if (min > matrix[x1][y])
                min = matrix[x1][y];

            que.add(matrix[x1][y]);
            matrix[x1][y] = que.poll(); //이전 값 넣기
        }

        //오른쪽 줄 옮기기(세로, x축 증가)
        for (int x = x1+1; x <= x2; x++) {
            if (min > matrix[x][y2])
                min = matrix[x][y2];

            que.add(matrix[x][y2]);
            matrix[x][y2] = que.poll();
        }

        //밑 줄 옮기기(가로, y축 감소)
        for (int y = y2-1; y >= y1; y--) {
            if (min > matrix[x2][y])
                min = matrix[x2][y];

            que.add(matrix[x2][y]);
            matrix[x2][y] = que.poll();
        }

        //왼쪽 줄 옮기기(세로, x축 감소)
        for (int x = x2-1; x >= x1; x--) {
            if (min > matrix[x][y1])
                min = matrix[x][y1];

            que.add(matrix[x][y1]);
            matrix[x][y1] = que.poll();
        }

        return min;
    }

    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        //1. 행렬 만들기
        int[][] matrix = makeMatrix(rows, columns);


        //2. 회전 하기
        for (int i = 0; i < queries.length; i++) {
            int x1 = queries[i][0] - 1;
            int y1 = queries[i][1] - 1;
            int x2 = queries[i][2] - 1;
            int y2 = queries[i][3] - 1;

            answer[i] = doRotate(matrix, x1, y1, x2, y2);
        }


        return answer;
    }
}
 

 

 

반응형

'PS > Programmers' 카테고리의 다른 글

[KAKAO] 오픈채팅방  (0) 2022.03.30
[Summer/Winter Coding(~2018)] 스킬트리  (0) 2022.03.29
더 맵게  (0) 2022.03.24
[2021 Dev-Matching] 다단계 칫솔 판매  (0) 2022.03.23
완주하지 못한 선수  (0) 2022.03.23