티스토리 뷰

#include <string>
#include <vector>

using namespace std;

int arr[101][101];

int cal(int x1, int y1, int x2, int y2)
{
    int min_num = arr[x1][y1];
    int tmp = arr[x1][y1];
    
    //시계 반대방향에서 끌어오기
    for(int i=x1; i<x2; i++) 
    {
        arr[i][y1] = arr[i+1][y1];
        min_num = min(min_num, arr[i][y1]);
    }
    
    for(int i=y1; i<y2; i++) 
    {
        arr[x2][i] = arr[x2][i+1];
        min_num = min(min_num, arr[x2][i]);
    }
    
    for(int i=x2; i>x1; i--) 
    {
        arr[i][y2] = arr[i-1][y2];
        min_num = min(min_num, arr[i][y2]);
    }
    
    
    for(int i=y2; i>y1; i--) 
    {
        arr[x1][i] = arr[x1][i-1];
        min_num = min(min_num, arr[x1][i]);
    }
    
    arr[x1][y1 + 1] = tmp;
    return min_num;
}

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    
    int num = 1;
    for(int i=0; i<rows; i++)
    {
        for(int j=0; j<columns; j++)
        {
            arr[i][j] = num++;
        }
    }
    
    for(int i=0; i<queries.size(); i++)
    {
        int x1 = queries[i][0]-1;
        int y1 = queries[i][1]-1; 
        int x2 = queries[i][2]-1; 
        int y2 = queries[i][3]-1; 
        
        answer.push_back(cal(x1, y1, x2, y2));
    }
    return answer;
}

 

수를 입력받는 것이 아니기에, 먼저 행렬에 따라 배열 값을 채워준다.

그리고 주어진 좌표를 따로 생성해준다.

좌표의 경우 0부터 시작하기에 입력받은 좌표 값들은 전부 -1을 해주어야 한다.

 

회전의 경우 시계 반대 방향을 생각하여 뒤에서 부터 끌어오는 방식을 생각한다.

먼저 왼쪽 열에 대해 아래에서 위로 끌어올린다.

따라서 arr[i][y1] = arr[i+1][y1]이 된다.

 

더 뒤로 가서 아래쪽 행을 체크하자.

우측에서 왼쪽으로 땡기는 형태이다.

따라서 arr[x2][i] = arr[x2][i+1]이 된다.

 

더 뒤로가서 우측 열을 보면 위에서 아래로 끌어내린다.

따라서 arr[i][y2] = arr[i-1][y2]이다.

 

마지막으로 위쪽 행이다.

좌측에서 우측으로 땡기는 형태이다.

따라서 arr[i][y2] = arr[i-1][y2]이다.

 

그리고 이때 주의점이 있는데, 시작 점이 사라지는 것이다.

맨 처음에 아래에서 위로 떙기면서 바로 아래있던 값이 처음 위치의 값을 덮어쓰게 된다.

따라서 맨 처음 값을 저장해뒀다가, 계산을 모두 마치고 올바른 위치에 있도록 해주어야한다.

이 경우에는 원래 위치 값이 우측으로 1칸 이동한 위치기에 arr[x1][y1 + 1] = tmp; 처리를 해주어야한다.

 

처음 시작을 x1, y1이렇게 잡고 시작해서 풀이를 진행했지만, 실제 좌표를 고려하면 y1, x1으로 순서를 바꿔서 풀이하는게 이해가 쉬울 것 같다.

해당 코드를 보면 x의 값이 y축이고, y의 값이 x축으로 사용되고 있기 때문이다.

실제로 x1, y1 이렇게 잡고 시작하니 회전시키며 순간 좌표 이동을 헷갈려서 풀이에 시간이 더 소비되었다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함