알고리즘 문제/프로그래머스

프로그래머스 행렬 테두리 회전하기 [Lv. 2] (C++)

우대비 2024. 11. 27. 12:28
반응형
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

행렬의 부분 행렬을 만들고 테두리를 회전시킬 때, 회전된 값 중 가장 작은 값은 무엇인지 찾아주세요.

 

 

풀이 방법

테두리를 회전시키는 로직은 deque를 이용하면 쉽게 해결이 가능합니다. 

테두리를 순회하며 시계방향으로 값을 넣어준 후, deque의 가장 뒤에 있는 값을 앞으로 다시 넣어주면 됩니다.

deque<int> dq;
vector<pair<int, int>> pos;

for (int i = sx; i <= ex; i++)
{
    dq.push_back(table[sy][i]);
    pos.push_back({sy, i});
}

for (int i = sy+1; i <= ey; i++)
{
    dq.push_back(table[i][ex]);
    pos.push_back({i, ex});
}

for (int i = ex-1; i >= sx; i--)
{
    dq.push_back(table[ey][i]);
    pos.push_back({ey, i});
}


for (int i = ey-1; i >= sy+1; i--)
{
    dq.push_back(table[i][sx]);
    pos.push_back({i, sx});
}

dq.push_front(dq.back());
dq.pop_back();

 

 

이후,  기존에 저장한 위치값을 순회하여 데이터를 다시 채워주면 회전이 완료됩니다.

for (int i = 0; i < dq.size(); i++)
{                
    table[pos[i].first][pos[i].second] = dq[i];
    value = min(value, dq[i]);
}

 

 

정답 코드

#include <string>
#include <vector>
#include <deque>
#include <iostream>

using namespace std;

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    
    vector<vector<int>> table(100, vector<int>(100));
    for (int i = 0; i < 100; i++)
        for (int j = 0; j < 100; j++)
            table[i][j] = i * columns + j+1;
    
    for (auto& querie : queries)
    {
        auto [sy, sx] = make_pair(querie[0]-1, querie[1]-1);
        auto [ey, ex] = make_pair(querie[2]-1, querie[3]-1);

        int value = 99999999;

        deque<int> dq;
        vector<pair<int, int>> pos;

        for (int i = sx; i <= ex; i++)
        {
            dq.push_back(table[sy][i]);
            pos.push_back({sy, i});
        }

        for (int i = sy+1; i <= ey; i++)
        {
            dq.push_back(table[i][ex]);
            pos.push_back({i, ex});

        }

        for (int i = ex-1; i >= sx; i--)
        {
            dq.push_back(table[ey][i]);
            pos.push_back({ey, i});
        }


        for (int i = ey-1; i >= sy+1; i--)
        {
            dq.push_back(table[i][sx]);
            pos.push_back({i, sx});
        }

        dq.push_front(dq.back());
        dq.pop_back();


        for (int i = 0; i < dq.size(); i++)
        {                
            table[pos[i].first][pos[i].second] = dq[i];
            value = min(value, dq[i]);
        }

        answer.push_back(value);
    }
    
    return answer;
}
반응형
LIST