Don't give up!

[프로그래머스] 행렬 테두리 회전 (java) 본문

Coding Test/Programmers

[프로그래머스] 행렬 테두리 회전 (java)

Heang Lee 2021. 5. 12. 14:07

코딩테스트 연습 - 행렬 테두리 회전하기 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

어떻게 생각하고 문제를 풀었는가?

행렬에서 테두리를 회전하는 것을 상/하/좌/우 4개의 직선 행렬로 나누어 원소를 한 칸씩 이동시키는 것으로 바꾸어 생각하였습니다.

원소의 이동은 이동할 위치의 원소 값을 따로 저장하고, 해당 위치에 이전 인덱스의 원소를 복사하는 과정을 반복하여 구현할 수 있습니다.

문제에서 주어진 시계방향을 그대로 사용한다면 반복문마다 따로 저장되는 원소의 값을 변경하여야하지만 반시계방향으로 값을 복사한다고 생각한다면 따로 저장해야할 원소는 시작 위치의 원소 뿐으로 메모리 공간을 효율적으로 사용할 수 있습니다.

코드

class Solution {
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        int[][] numbers = new int[rows][columns];
        for(int i=0;i<rows;i++){    //rows == x
            for(int j=0;j<columns;j++){ //columns == y
                numbers[i][j] = i*columns + j+1;
            }
        }
        
        for(int k=0; k<queries.length; k++){
            int x1 = queries[k][0]-1;
            int y1 = queries[k][1]-1;
            int x2 = queries[k][2]-1;
            int y2 = queries[k][3]-1;
            int temp = numbers[x1][y1];
            answer[k] = temp;
            for(int i=x1;i<x2;i++){//좌측 부분
                numbers[i][y1] = numbers[i+1][y1];
                if(numbers[i][y1] < answer[k]) answer[k] = numbers[i][y1];
            }
            for(int i=y1;i<y2;i++){ //하단 부분
                numbers[x2][i] = numbers[x2][i+1];
                if(numbers[x2][i] < answer[k]) answer[k] = numbers[x2][i];
            }
            for(int i=x2;i>x1;i--){//우측 부분
                numbers[i][y2] = numbers[i-1][y2];
                if(numbers[i][y2] < answer[k]) answer[k] = numbers[i][y2];
            }
            for(int i=y2; i>y1+1; i--){ //상단부분
                numbers[x1][i] = numbers[x1][i-1];
                if(numbers[x1][i] < answer[k]) answer[k] = numbers[x1][i];
            }
            numbers[x1][y1+1] = temp;
        }
            
        return answer;
    }
} 

설계를 바탕으로 코드를 작성하였습니다.

 

코드를 작성할 때 주의해야할 점이 있는데, 문제에서 주어진 x, y는 x행 y열을 의미하기 때문에 Array[x][y]로서 문제를 해결하여야 합니다.

(x, y)의 좌표로서 문제를 바라보신다면 Array[y][x]가 되므로 초기 배열의 값을 넣는 식을 변경해야 할 필요가 있습니다.