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

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

접근 방법

  1. rows, columns가 100이하이다. O(n^2)도 무리 없이 돌아가므로 구현으로 풀었다
  2. 먼저 조건에 맞는 map을 만든다
  3. 각 쿼리에 맞는 회전을 수행하며 가장작은 숫자를 받아와 ansList에 담는다
  4. 회전을 구현한다
    1. 회전은 swap할때 처럼 tmp에 최초 원소를 담고 주어진 방향 순서대로 돌며 값을 덮어썼다.
    2. 마지막에 최초원소가 가야할 자리에 tmp를 덮어썼다.

코드

class Solution {
    int n,m;
    int[][] map;
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] ans = new int[queries.length];
        n = rows;
        m = columns;
        int num = 1;
        map = new int[n][m];
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < m ; j++){
                map[i][j] = num++;
            }
        }
        
        int idx = 0;
        for(int[] q : queries){
            int sr = q[0]-1;int sc = q[1]-1;
            int er = q[2]-1;int ec = q[3]-1;
            
            int minValue = rotate(sr,sc,er,ec);
            ans[idx++] = minValue;
        }
        
        return ans;
    }
    int rotate(int sr,int sc,int er,int ec){
        int tmp = map[sr][sc];
        int min = map[sr][sc];
        
        int vl = er-sr; int hl = ec-sc;
        
        for(int i = 0 ; i < vl ; i++){ //좌
            min = Math.min(min, map[sr+1+i][sc]);
            map[sr+i][sc] = map[sr+1+i][sc];
        }
        for(int i = 0 ; i < hl ; i++){ //하
            min = Math.min(min, map[er][sc+1+i]);
            map[er][sc+i] = map[er][sc+1+i];
        }
        for(int i = 0 ; i < vl ; i++){ //우
            min = Math.min(min, map[er-1-i][ec]);
            map[er-i][ec] = map[er-1-i][ec];
        }
        for(int i = 0 ; i < hl ; i++){ //상
            min = Math.min(min, map[sr][ec-1-i]);
            map[sr][ec-i] = map[sr][ec-1-i];
        }
        map[sr][sc+1] = tmp;
        return min;
    }
}