알고리즘

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

박카스마시며코딩 2021. 12. 25. 16:28

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 {
    static int map[][];
    static int dy[] = {0,1,0,-1};
    static int dx[] = {1,0,-1,0};
    static void init(int row, int col){
        int num = 1;
        map = new int[row][col];
        for(int i = 0 ; i < row ; i++){
            for(int j = 0 ; j < col ; j++){
                map[i][j] = num++;
            }
        }
    }
    static int cal(int y1, int x1, int y2, int x2){
        int ny = y1;
        int nx = x1;
        int prev = map[y1][x1];
        int result = prev;
        for(int i = 0 ; i < 4; i++){
            ny += dy[i];
            nx += dx[i];
            while(ny >= y1 && ny <= y2 && nx >= x1 && nx <= x2){
                int temp = map[ny][nx];
                map[ny][nx] = prev;
                prev = temp;
                result = Math.min(result, prev);
                ny += dy[i];
                nx += dx[i];
            }
            ny -= dy[i];
            nx -= dx[i];
        }
        // System.out.println("----------------------");
        // print();
        return result;
    }
    static void print(){
        for(int i = 0 ; i < map.length ; i++){
            for(int j = 0 ; j < map[0].length ; j++){
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }
    }
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        init(rows,columns);
        int index = 0;
        for(int[] query : queries){
            answer[index++] = cal(query[0]-1, query[1]-1, query[2]-1, query[3]-1);
        }
        return answer;
    }
}