자바/코딩테스트

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

대전집주인 2024. 5. 27. 17:35
728x90
SMALL

 

문제 이해

  • rows x , columns y 의 행을 가지고 있는 행렬이 있다.
  • queries 배열에는 (x1,y1,x2,y2) 의 좌표값을 가지고 있는데 해당 좌표 (x1,y1) 에서 (x2,y2) 범위를 지정하여 테두리 영역만 시계방향으로 한번 회전 시킨다.
  • queries 배열에 있는 만큼 회전을 반복한다.
  • 회전 할때마다 나오는 최소값들을 배열에 담아서 나타내라.
  • 소용돌이 문제로 인식하여 좌표범위의 영역을 상,하,좌,우 방향으로 회전시키면서 배열에 저장시켰다.
  • 시계방향으로 회전하면서 이전 좌표의 값을 한칸씩 옮겨야하는데 현재 배열을 그대로 사용하면 이전 좌표값의 값을 알수 없기에 copyArr 배열을 준비하여 소용돌이를 도는동안 copyArr 배열의 값으로 이전 좌표값을 알아낼수 있다.
  • 소용돌이가 한바퀴 완료하면 resultArr -> copyArr 로 완전복사하여 queries 배열이 끝날때까지 반복한다.
  • result 변수에 제한사항이 원소값 최대가 10000 이하임으로 10001을 넣어주고 좌표를 이동할때마다 Math.min 함수로 최소값이 나올수 있게 설정했다.
import java.util.*;
class Solution {
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        int[][] resultArr = new int[rows][columns];
        int[][] copyArr = new int[rows][columns];
        
        int cnt = 1;
        for(int i = 0; i<rows; i++){
            for(int j = 0; j<columns; j++){
                int n = cnt++;
                resultArr[i][j] = n;
                copyArr[i][j] = n;
            }
        }
        
        for(int i = 0; i<queries.length; i++){
            int preX = queries[i][0] - 1;
            int preY = queries[i][1] - 1;
            int postX = queries[i][2] - 1;
            int postY = queries[i][3] - 1;
            
            answer[i] = rollingArray(resultArr, copyArr, preX, preY, postX, postY);
        }
        
        return answer;
    }
    
    // 소용돌이
    public int rollingArray(int[][] resultArr, int[][] copyArr, int preX, int preY, int postX, int postY){
        
        int dir = 0; // 0 - 우, 1 - 하, 2 - 좌, 3 - 상
        int x = preX;   // 세로
        int y = preY;   // 가로
        int result = 10001;
        int tmp = 0;
            
        while(true){
            if(dir == 0 && y == postY){
                dir = 1;
            }else if(dir == 1 && x == postX){
                dir = 2;
            }else if(dir == 2 && y == preY){
                dir = 3;
            }else if(dir == 3 && x == preX){
                resultArr[preX][preY] = copyArr[preX+1][preY];
                result = Math.min(result, resultArr[preX][preY]);
                break;
            }
            
            tmp = copyArr[x][y];
            
            if(dir == 0){
                y++;
            }else if(dir == 1){
                x++;
            }else if(dir == 2){
                y--;
            }else if(dir == 3){
                x--;
            }
            
            resultArr[x][y] = tmp;
            result = Math.min(result, resultArr[x][y]);
        }
        
        for(int i = 0; i<resultArr.length; i++){
            for(int j = 0; j<resultArr[i].length; j++){
                copyArr[i][j] = resultArr[i][j];
            }
        }
        
        return result;
    }
}
728x90
LIST