💡Problem Solving/Programmers

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

gom20 2021. 11. 27. 13:24

문제

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

 

풀이

단순 구현문제인데 너무 어렵게 생각했던 것 같다. 

시계 방향으로 돌면서 이전 값을 현재 값으로 갱신해주는 것을 반복하면 된다.

현재 값을 갱신할 때 최소값 비교를 통해 최소값 또한 갱신한다.

 

소스코드

import java.util.*;
class Solution {
    public int[][] map;
    public ArrayList<Integer> answer;
    public int[] solution(int rows, int columns, int[][] queries) {
        answer = new ArrayList<Integer>();
        // 맵 초기화
        map = new int[rows+1][columns+1];
        int num = 1;
        for(int i = 1; i <= rows; i++){
            for(int j = 1; j <= columns; j++){
                map[i][j] = num;
                num++;
            }  
            
        }
        for(int i = 0; i < queries.length; i++){
            answer.add(rotate(queries[i]));   
        }
    
        return answer.stream().mapToInt(x->x).toArray();
    }
    
    public int rotate(int[] query){
        int sX = query[0];
        int sY = query[1];
        int eX = query[2];
        int eY = query[3];
        
        // 블록 한 개는 겹치므로 마지막 턴에서 갱신하도록 제외
        int prev = map[sX][sY];
        int min = prev;
        // 오른쪽으로~
        for(int i = sY+1; i <= eY; i++){
            int temp = map[sX][i];
            map[sX][i] = prev;
            min = Math.min(prev, min);
            prev = temp;
        }
        // 아래로~
        for(int i = sX+1; i <= eX; i++){
            int temp = map[i][eY];
            map[i][eY] = prev;
            min = Math.min(prev, min);
            prev = temp;
        }
        // 왼쪽으로~
        for(int i = eY-1; i >= sY; i--){
            int temp = map[eX][i];
            map[eX][i] = prev;
            min = Math.min(prev, min);
            prev = temp;
        }
        // 위로~
        for(int i = eX-1; i >= sX; i--){
            int temp = map[i][sY];
            map[i][sY] = prev;
            min = Math.min(prev, min);
            prev = temp;
        }
     
        return min;
    }
}