알고리즘

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

쿠키담임선생님 2022. 12. 1. 19:35

 

풀이방법


4방향을 구간별로 나누어서 생각하면 된다.

일단 가장 왼쪽 위에 있는 부분을 temp 임시변수에 저장해두고 왼쪽부터 한칸 밀어올리고 빈자리에 아래부분을 또 밀어넣고 그 다음은 오른쪽라인, 그 뒤는 위쪽라인 밀어넣은 뒤 빼둔 temp를 끼워맞춰주면 된다.

 

코드


class Solution {
    static int[][]map;
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        //rows 와 columns 를 입력받고 그만큼의 배열을 생성 후 배열에 값을 넣어준다 최소1부터 두개 곱한게 최대값
        map = new int[rows][columns];
        int idx = 1;
        for(int i =0;i<rows; i++){
            for(int j =0; j<columns; j++){
                map[i][j] = idx++;
            }
        }
        //이제 배열 돌리기 할 차례. 함수로 만들고 세번 넣는다.
        for(int i = 0 ;i<queries.length;i++){
            answer[i] = turnOver(queries[i]);
        }
        
        return answer;
    }
    public static int turnOver(int[]query){
        int r1 = query[0]-1;
        int c1 = query[1]-1;
        int r2 = query[2]-1;
        int c2 = query[3]-1;
        int temp = map[r1][c1];
        int min = temp;
        for(int i = r1; i<r2; i++){ //좌측 면 이동
            map[i][c1] = map[i+1][c1];
            if(min>map[i][c1]){ //최솟값 갱신해줌
                min = map[i][c1];
            }
        }
        for(int i = c1; i< c2; i++){//아래 면 이동. 좌측다음 아래인 이유는 좌측을 하나씩 떙겨서 빈자리가 생기기때문.
            map[r2][i] = map[r2][i+1];
            if(min>map[r2][i]){
                min = map[r2][i];
            }
        }
        for(int i = r2; i>r1; i--){
            map[i][c2] = map[i-1][c2];
            if(min>map[i][c2]){
                min = map[i][c2];
            }
        }
        for(int i = c2; i>c1; i--){
            map[r1][i] = map[r1][i-1];
            if(min>map[r1][i]){
                min = map[r1][i];
            }
        }
        map[r1][c1+1] = temp; //임시저장햇던거 끼워넣어줌
        
        return min;
    }
}