[Algo/Programmers] 자바 - 행렬 테두리 회전하기

RGunny·2021년 6월 7일
0

algo

목록 보기
5/20

[Algorithm/Programmers] 자바 - 전화번호 목록

문제플랫폼난이도유형풀이 링크문제 링크
행렬 테두리 회전하기Programmers2021 Dev-Matching: 웹 백앤드 개발자(상반기)---풀이문제

문제 해석

문제1

  • r x c 크기의 행렬에1부터 숫자가 적혀있습니다.
  • 직사각형 범위를 여러 번 선택합니다.
  • 해당 직사각형의 테두리에 해당하는 숫자를
  • 시계방향으로 회전합니다.

문제2

  • 문제에서 주어진 다음 그림과 같은 형태가 될 것입니다.

문제3

  • rows, columns, queires가 인풋으로 주어지고,
  • 각 회전(x1, y1, x2, y2)을 적용한 뒤,
  • 회전 후 위치가 바뀐 숫자들가장 작은 숫자순서대로 배열에 담아 리턴하라고 합니다.
    • 위치가 바뀐 숫자는 자명히 테두리의 숫자일 것입니다.
    • 각 회전을 하며 해당 테두리 내의 숫자 중 가장 작은 값만 따로 담으면 될 것 같습니다.
    • 회전이 여러 번 진행되므로 회전을 꼭 시행해야 합니다.
    • 순서대로 담아야 하니 모든 회전이 끝난 후(배열의 각 회전의 가장 작은 숫자를 담은 후) 오름차순 정렬이 필요할 듯 합니다.

풀이

  • 회전을 위해 x1, y1을 임시저장한 뒤,
  • 회전할 테두리의 왼쪽 변, 아래 변, 오른쪽 변, 윗 변 순으로 회전시키겠습니다.
  • 회전을 하며 회전하는 숫자들의 최솟값을 따로 담아줍니다.
import java.util.*;

class Solution {
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] ans = new int[queries.length];
        int[][] map = createMap(rows, columns);
        int qLen = queries.length;
        for (int i = 0; i < qLen; i++) {
            ans[i] = rotate(map, queries[i][0], queries[i][1], queries[i][2], queries[i][3]);
        }
        
        return ans;
    }
    
    private static int rotate(int[][] map, int x1, int y1, int x2, int y2) {

        int temp = map[x1][y1];
        int min = temp;

        for (int i = x1; i < x2; i++) {
            map[i][y1] = map[i + 1][y1];
            min = Math.min(min, map[i][y1]);
        }

        for (int i = y1; i < y2; i++) {
            map[x2][i] = map[x2][i + 1];
            min = Math.min(min, map[x2][i]);
        }

        for (int i = x2; i > x1; i--) {
            map[i][y2] = map[i - 1][y2];
            min = Math.min(min, map[i][y2]);
        }

        for (int i = y2; i > y1; i--) {
            map[x1][i] = map[x1][i - 1];
            min = Math.min(min, map[x1][i]);
        }
        map[x1][y1 + 1] = temp;

        return min;
    }
    
    private static int[][] createMap(int r, int c) {
        int[][] map = new int[r+1][c+1];
        int cnt = 1;
        for (int i = 1; i <= r; i++) {
            for (int j = 1; j <= c; j++) {
                map[i][j] = cnt++;
            }
        }
        return map;
    }
    
}

0개의 댓글