본문으로 바로가기

행렬 테두리 회전(Level 2)

문제

전체 문제 보기

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

접근법

문제에서 주어진 기능을 정확히 구현만 하면 되는 간단한 문제입니다. 이 문제의 가장 중요한 기능인 행렬의 회전은 시작 값을 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;
}