• [level2] 프로그래머스 - 행렬 테두리 회전하기(JAVA)

    2021. 9. 19.

    by. 데롱디롱

     

     

    [ 문제 풀이 ]

    - 행 : rows, 열 : colums 을 가진 matrix배열을 만들고 1부터 숫자를 채워 넣는다.

     

     

    - 이동 방향은 [ 오른쪽 -> 아래 -> 왼쪽 -> 위 ] 이므로 dr와 dc를 맞게 만들어준다.
       후에 각 모서리에 도착할 때마다, index를 증가시켜 방향을 전환한다.

    오른쪽 : ( 0, +1 )
    아래 : ( +1, 0 )
    왼쪽 : ( 0, -1 )
    위 : ( -1, 0 )

    int[] dr = { 0, 1, 0, -1 };
    int[] dc = { 1, 0, -1, 0 };

     

     

    - Queue에 회전 방향을 바꿀 좌표인, 네 모서리의 좌표를 들릴 순서대로 넣어준다.
       시작점은 마지막에 도착할 장소이므로 제일 마지막에 넣는다.

     

     

    - 한 바퀴 돌 때까지 d방향으로 계속 이동한다.

    - value : 현재 {r, c}의 값을 저장해둔다.
    - min : 돌면서 만나는 value 중에 최솟값을 저장한다.
    - temp : 이동 전 위치에서 가져온 값을 저장한다. (현재 위치에 넣을 값)

    ----------------------------------------------------------------

    - temp가 0이면, 이제 막 시작한 것이므로 값을 바꾸지 않고 이동만 한다.
    - 만약 현재 위치가 queue의 처음(앞으로 들려야 할 꼭짓점)에 있는 곳이라면 방향을 바꾼다=> d++
    - temp를 value로 바꾼다.
    - queue가 빈 것이 되면, while문을 종료시킨다.

     

     

    - answer에 한 바퀴 회전하면서 구한 최솟값을 저장한다.

     

     

     

     

    [ 전체 코드 ]

    import java.util.LinkedList;
    import java.util.Queue;
    
    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++;
    
            int[] dr = { 0, 1, 0, -1 }, dc = { 1, 0, -1, 0 };
    
            // 회전
            for (int i = 0; i < queries.length; i++) {
                int min = Integer.MAX_VALUE;
    
                // 회전하면서 들릴 꼭짓점 순서대로 넣어주기
                Queue<int[]> queue = new LinkedList<int[]>();
                queue.offer(new int[] { queries[i][0] - 1, queries[i][3] - 1 });
                queue.offer(new int[] { queries[i][2] - 1, queries[i][3] - 1 });
                queue.offer(new int[] { queries[i][2] - 1, queries[i][1] - 1 });
                queue.offer(new int[] { queries[i][0] - 1, queries[i][1] - 1 });
    
                int temp = 0, d = 0;
                int r = queries[i][0] - 1, c = queries[i][1] - 1;
    
                while (!queue.isEmpty()) {
                    // 바꾸고
                    int value = matrix[r][c]; // 원래 값 저장
                    min = Math.min(min, value);
    
                    if (temp != 0)
                        matrix[r][c] = temp;
    
                    // 이동
                    // 현재 위치가 꼭짓점이면, d증가
                    int p[] = queue.peek();
                    if (r == p[0] && c == p[1]) {
                        queue.poll();
                        if (queue.isEmpty())
                            break;
                        d++;
                    }
    
                    r += dr[d];
                    c += dc[d];
                    temp = value;
                }
    
                answer[i] = min;
            }
    
            return answer;
        }
    }

    댓글