본문 바로가기
알고리즘/programmers

프로그래머스 - 행렬 테두리 회전하기

by 유이얼 2021. 10. 9.
#include <string>
#include <vector>
#include <iostream>

using namespace std;

vector<vector<int>> board;
int c;
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};

int r(vector<int> q) {
    int dir = 0;
    int sy = q[0] - 1;
    int sx = q[1] - 1; 
    int ey = q[2] - 1;
    int ex = q[3] - 1;
    
    int cy = sy + dy[dir];
    int cx = sx + dx[dir];
    int t = board[sy][sx];
    int ans = c;
    
    while (1) {
        ans = min(ans, t);
        swap(t, board[cy][cx]);
        if (cy == sy && cx == sx) {
            break;
        }
        
        if (cx == ex && cy == sy ||
            cx == ex && cy == ey || 
            cx == sx && cy == ey)
            ++dir;
        
        cy += dy[dir];
        cx += dx[dir];
    }
    return ans;
}

int f(vector<int> &q) {
    int y1 = q[0] - 1;
    int x1 = q[1] - 1;
    int y2 = q[2] - 1;
    int x2 = q[3] - 1;
    
    int ans = c;
    
    int t = board[y1][x1];
    for (int i = x1; i < x2; ++i) {
        int t2 = board[y1][i+1];
        board[y1][i+1] = t;
        ans = min(ans, t);
        t = t2;
    }
    
    for (int i = y1; i < y2; ++i) {
        int t2 = board[i+1][x2];
        board[i+1][x2] = t;
        ans = min(ans, t);
        t = t2;
    }
    
    for (int i = x2; i > x1; --i) {
        int t2 = board[y2][i-1];
        board[y2][i-1] = t;
        ans = min(ans, t);
        t = t2;
    }
    
    for (int i = y2; i > y1; --i) {
        int t2 = board[i-1][x1];
        board[i-1][x1] = t;
        ans = min(ans, t);
        t = t2;
    }
    return ans;
}

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    board.resize(rows, vector<int>(columns));
    c = 0;
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < columns; ++j)
            board[i][j] = ++c;
    }
    
    vector<int> answer;
    for (auto q : queries) {
        answer.push_back(r(q));
    }
    
    return answer;
}