알고리즘/PS - 프로그래머스

[프로그래머스 - Java] 행렬 테두리 회전하기

excited-hyun 2021. 8. 6. 15:43
반응형

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

 

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

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

 

풀이

이 문제는 달팽이 문제가 생각나는 문제 유형입니다.

효율성이 중요한 문제도 아니기 때문에 무난하게 풀이 가능한 문제 입니다.

 

회전과 최솟값 확인을 한 번에 할 수도 있지만 저는 둘을 따로 for문을 만들어 각자 해주었습니다.

또한 회전에는 두개의 2차원 배열을 이용하여 하나의 배열에는 회전을 임시로 저장해 두었습니다. 하나만 이용할 경우는 값의 수정이 이루어지는 과정에서 적용이 안되는 부분이 있을 수 있습니다.

 

  1. 문제에서 사용할 row*col크기의 행렬(코드에서는 board 배열)을 하나 만들어 준 후, 2중 for문을 이용해 1~row*col까지의 값을 해당하는 위치에 넣어줍니다.
  2. 그런 뒤, 우선은 테두리에 해당하는 부분들을 확인해서 그 테두리의 숫자들 중 최솟값을 찾아주었습니다.
  3. 테두리의 숫자 중 최솟값을 찾은 후에는 회전을 수행합니다.
  4. 회전에 있어서는 행렬의 값을 담고 있는 board 배열과 회전 수행시 값을 임시로 저장할 temp배열을 사용합니다.
  5. 회전을 수행할 때는 board배열의 값을 그대로 유지하면서 temp배열의 값만 변화시켜줍니다.
  6. 회전 수행 완료 후에는 temp의 값을 board에 넣어줍니다.
class Solution {
    public int[] solution(int rows, int columns, int[][] queries) {
        int querySize = queries.length;
        int[] answer = new int[querySize];
        int[][] board = new int[rows][columns];
        int[][] temp = 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;
                temp[i][j] = num;
                num++;
            }
        }
        for(int i=0; i<querySize; 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;
            
            
            int minNum = board[x1][y1];
            // 가로: 맨 윗줄, 맨 아래줄 최솟값 확인
            for(int j=y1; j<=y2; j++){
                if (minNum > board[x1][j])
                    minNum = board[x1][j];
                if (minNum > board[x2][j])
                    minNum = board[x2][j];
            }
            
            //세로 : 맨 왼쪽 줄, 맨 오른쪽줄 최솟값 확인
            for(int j=x1; j<=x2; j++){
                if (minNum > board[j][y1])
                    minNum = board[j][y1];
                if (minNum > board[j][y2])
                    minNum = board[j][y2];
            }
            
            //회전 수행: 맨 위 가로 ->
            for(int j=y1+1; j<=y2; j++){
                temp[x1][j] = board[x1][j-1];
            }
            //회전 수행: 맨 아래 가로 ->
            for(int j=y1; j<=y2-1; j++){
                temp[x2][j] = board[x2][j+1];
            }
            
            //회전 수행: 맨 왼쪽 세로
            for(int j=x1; j<=x2-1; j++){
                temp[j][y1] = board[j+1][y1];
            }
            
            //회전 수행: 맨 오른쪽 세로
            for(int j=x1+1; j<=x2; j++){
                temp[j][y2] = board[j-1][y2];
            }
            
            //board 배열에 회전 적용
            for(int k=0; k<rows; k++){
                for(int j=0; j<columns; j++){
                    board[k][j] = temp[k][j];
                }
            }
            
            
            answer[i]=minNum;
        }
        return answer;
    }
}
728x90
반응형