본문 바로가기

Algorithm/Programmers

[Programmers] 행렬 테두리 회전하기

안녕하세요. 이번 포스팅에서는 Programmers 행렬 테두리 회전하기 문제를 풀어보도록 하겠습니다.

 

해당 문제는

https://programmers.co.kr/learn/courses/30/lessons/77485

 

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

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

 

위 링크에서 확인하실 수 있습니다.

 

 

문제의 특별한 제한은 딱히 없고, 단순 구현으로 해결하시면 됩니다.

 

저의 경우

 

1. vector<int> v를 선언하여 시계방향으로 원소를 담아주었습니다.

 

2. v를 rotate 함수를 활용하여 한 칸씩 뒤로 미뤄주었습니다.

 

3. 미뤄진 칸을 기반으로 다시 원래의 자리에 넣어주었습니다. 이때 v에서 min_element를 매번 answer에 저장해주었습니다.

 

<소스 코드>

#include <bits/stdc++.h>
using namespace std;

int arr[104][104];
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    
    int cnt = 1;
    for(int i = 1; i <= rows; i++) 
        for(int j = 1; j <= columns; j++) arr[i][j] = ((i-1) * columns + j);
    
    for(int i = 0; i < queries.size(); i++) {
        vector<int> query = queries[i];
        vector<int> v;
        
        int x1 = query[0], y1 = query[1], x2 = query[2], y2 = query[3];
        
        for(int i = y1; i <= y2; i++) v.push_back(arr[x1][i]);
        for(int i = x1+1; i <= x2; i++) v.push_back(arr[i][y2]);
        for(int i = y2-1; i >= y1; i--) v.push_back(arr[x2][i]);
        for(int i = x2-1; i >= x1+1; i--) v.push_back(arr[i][y1]);
        
        rotate(v.begin(), v.end()-1, v.end());
        
        int idx = 0;
        for(int i = y1; i <= y2; i++) arr[x1][i] = v[idx++];
        for(int i = x1+1; i <= x2; i++) arr[i][y2] = v[idx++];
        for(int i = y2-1; i >= y1; i--) arr[x2][i] = v[idx++];
        for(int i = x2-1; i >= x1+1; i--) arr[i][y1] = v[idx++];
        
        answer.push_back(*min_element(v.begin(), v.end()));
    }    
    
    
    return answer;
}

 

*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.