행렬 테두리 회전(Level 2)
문제
접근법
문제에서 주어진 기능을 정확히 구현만 하면 되는 간단한 문제입니다. 이 문제의 가장 중요한 기능인 행렬의 회전은 시작 값을 temp
에 저장한 후 한칸씩 shift 하여 계산 할 수 있습니다. 이때 회전에서 사용되는 수들 중 가장 작은 값을 함께 계산할 수 있습니다.
전체 구현
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> table;
const int INF = 10'001;
int Rotate(const vector<int>& qr)
{
int r1 = qr[0];
int c1 = qr[1];
int r2 = qr[2];
int c2 = qr[3];
int temp = table[r1][c1];
int retval{temp};
//↑
for(int i = r1; i < r2; ++i)
{
table[i][c1] = table[i + 1][c1];
retval = min(retval, table[i][c1]);
}
//←
for(int i = c1; i < c2; ++i)
{
table[r2][i] = table[r2][i + 1];
retval = min(retval, table[r2][i]);
}
//↓
for(int i = r2; i > r1; --i)
{
table[i][c2] = table[i-1][c2];
retval = min(retval, table[i][c2]);
}
//→
for(int i = c2; i > c1; --i)
{
table[r1][i] = table[r1][i - 1];
retval = min(retval, table[r1][i]);
}
table[r1][c1+1] = temp;
return retval;
}
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer;
table.resize(rows + 1);
table[0].resize(columns + 1, 0);
for(int i = 1; i < rows + 1; ++i)
{
table[i].resize(columns + 1);
for(int j = 1; j < columns + 1; ++j)
{
table[i][j] = j + (i - 1) * columns;
}
}
for(const vector<int>& query : queries)
{
answer.push_back(Rotate(query));
}
return answer;
}