코딩 테스트/프로그래머스

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

programmers.co.kr/learn/courses/30/lessons/77485?language=java

 

코딩테스트 연습 - 행렬 테두리 회전하기

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

직사각형 전체를 map으로 두고 순서대로 변경해가면되는 구현문제

퀴리가 0, 0 위치를 1, 1로 시작하기 때문에 map의 가로 세로를 +1씩하여 생성

x축,y축으로 이동해야하는 거리를 구함(xMove, yMove)

시계방향으로 회전

// 프로그래머스 행렬 테두리 회전하기 문제
class Solution {
    static int[][] map;
    static int min;
    public int[] solution(int rows, int columns, int[][] queries) {
        map = new int[rows + 1][columns + 1];
        int[] answer = new int[queries.length];
        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[i] = rotation(queries[i]);
        }
        return answer;
    }

    static int rotation(int[] query) {
        // 직사각형의 가로 세로 길이
        int xMove = query[2] - query[0];
        int yMove = query[3] - query[1];

        // 현재 위치 및 현재 값
        int nx = query[0];
        int ny = query[1];
        int now = map[nx][ny];

        // 현재값을 최소값으로 초기화
        min = now;

        // 오른쪽
        for(int i = 0; i < yMove; i++) {
            ny += 1;
            now = move(nx, ny, now);
        }

        // 아래
        for(int i = 0; i < xMove; i++) {
            nx += 1;
            now = move(nx, ny, now);
        }

        // 왼쪽
        for(int i = 0; i < yMove; i++) {
            ny -= 1;
            now = move(nx, ny, now);
        }

        // 위쪽
        for(int i = 0; i < xMove; i++) {
            nx -= 1;
            now = move(nx, ny, now);
        }
        return min;
    }

    static int move(int x, int y, int before) {
        // 이동한 지점의 값을 temp 에 임시 저장
        int temp = map[x][y];

        // 최소값 초기화
        min = Math.min(min, temp);

        // 이동한 지점의 값을 이전 지점의 값으로 초기화
        map[x][y] = before;

        return temp;
    }
}