[프로그래머스(Programmers)] 2021 Dev-Matching: 웹 백엔드 개발자(상반기) :: 행렬 테두리 회전하기 (java)

2
post-thumbnail

안녕하세요. 오늘은 행렬 테두리 회전하기 문제를 풀어보겠습니다. 이 문제는 2021 Dev-Matching: 웹 백엔드 개발자(상반기) 에서 출제되었습니다.


문제 링크

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

문제 풀이

✔ rotate함수 설명


위 그림은 rotate함수에 있는 4개의 for문이 돌아가는 순서입니다. 초기 숫자인 "8"을 tmp 변수에 넣고, 14를 8이 있었던 자리에 넣는 것부터 시작합니다. 마지막에는 9가 있었던 자리에 8을 넣고 rotate함수는 종료됩니다.

전체코드

class Solution {
    
    private int[][] matrix;
    
    public int[] solution(int rows, int columns, int[][] queries) {
        matrix = new int[rows][columns];
        int[] answer = new int[queries.length];
        int num = 1;
        
        // matrix 행렬 초기화
        for(int i = 0; i < rows; i++){
            for(int j = 0; j < columns; j++){
                matrix[i][j] = num;
                num++;
            }
        }
        
        for(int i = 0; i < queries.length; i++){ 
            answer[i] = rotate(queries[i]);
        }
        
        return answer;
    }
    
    private int rotate(int[] query){
        int r1 = query[0]-1; 
        int c1 = query[1]-1;
        int r2 = query[2]-1;
        int c2 = query[3]-1;
        
        int temp = this.matrix[r1][c1]; // 시작위치 값 임시저장
        int min = temp;                 // min값 초기화
        for(int i = r1; i < r2; i++){ // 문제설명 그림의 1번
            matrix[i][c1] = matrix[i+1][c1];
            if(min > matrix[i][c1]) min = matrix[i][c1];
        }
        
        for(int i = c1; i < c2; i++){ // 문제설명 그림의 2번
            matrix[r2][i] = matrix[r2][i+1];
            if(min > matrix[r2][i]) min = matrix[r2][i];
        }
        
        for(int i = r2; i > r1; i--){ // 문제설명 그림의 3번
            matrix[i][c2] = matrix[i-1][c2];
            if(min > matrix[i][c2]) min = matrix[i][c2];
        }
        
        for(int i = c2; i > c1; i--){ // 문제설명 그림의 4번
            matrix[r1][i] = matrix[r1][i-1];
            if(min > matrix[r1][i]) min = matrix[r1][i];
        }
        
        matrix[r1][c1+1] = temp; // 임시저장한 값 저장
        
        return min; //최솟값 반환
    }
    
}

느낀점

어떻게 풀지 방법은 이해했었다. 로직이 어렵지 않아보였다. 재귀함수로 풀어보았지만, 풀이 도중 너무 햇갈려져서 포기했다. 다른 방법으로 다시 풀어볼까 했지만 한 문제에 너무 시간을 오래 허비하는 것 같아서 답을 찾아봤다. 역시 알고리즘 능력자들은 정말 많다.


[참고한 곳]
https://dev-note-97.tistory.com/265

0개의 댓글