티스토리 뷰

https://programmers.co.kr/learn/courses/30/lessons/77485

🐢 설명

2차원 배열 돌리기 문제이다.

 

쿼리에는 왼쪽위 좌표와 오른쪽 아래 좌표가 주어지고, 해당 쿼리 배열을 담은 queries 배열이 주어진다. 이때 하나의 쿼리문에 대해서 시계방향으로 1만큼 씩 돌리고 이동한 값들 중에서 최소값을 구한 후 반환하도록 하면 된다.

 

즉, for (쿼리 : 모든 쿼리) : 쿼리좌표 기준으로 돌림을 하면된다.

 

이때 배열을 돌리기 위해서 임시 배열을 하나 만들어줘야 하는데 2차원 배열을 깊은 복사를 하기 위해 for문으로 clone을 해준다. clone()함수는 1차원 배열을 깊은 복사하기 위한 함수로 2차원 배열은 row마다 돌면서 해줘야 깊은복사가 된다. 바로 하면 얕은 복사가 되므로 주의해야 한다.

🐢코드

import java.util.*;

class Solution {
    static int[][] nums;
    static int[] answer;
    static int row, col;

    public int[] solution(int rows, int columns, int[][] queries) {

        row = rows;
        col = columns;
        nums = new int[rows][columns];

        int n = 1;
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                nums[i][j] = n++;
            }
        }

        int i = 0;
        answer = new int[queries.length];
        for (int[] query : queries) {
            int min = turn(query);
            answer[i++] = min;
        }

        return answer;
    }

    private static int turn(int[] query)
    {
        int[][] copyArray = new int[row][col];
        for (int i = 0; i < row; i++)
            copyArray[i] = nums[i].clone();

        int y1 = query[0] - 1;
        int x1 = query[1] - 1;
        int y2 = query[2] - 1;
        int x2 = query[3] - 1;
        int min = 10001;

        // 위
        for (int x = x1; x < x2; x++) {
            copyArray[y1][x + 1] = nums[y1][x];
            min = Math.min(min, nums[y1][x]);
        }

        // 아래
        for (int x = x2; x > x1; x--) {
            copyArray[y2][x - 1] = nums[y2][x];
            min = Math.min(min, nums[y2][x]);
        }

        // 오른쪽
        for (int y = y1; y < y2; y++) {
            copyArray[y + 1][x2] = nums[y][x2];
            min = Math.min(min, nums[y][x2]);
        }

        // 왼쪽
        for (int y = y2; y > y1; y--) {
            copyArray[y - 1][x1] = nums[y][x1];
            min = Math.min(min, nums[y][x1]);
        }

        for (int i = 0; i < row; i++)
            nums[i] = copyArray[i].clone();

        return min;
    }
}

🐢 마무리

반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday