본문 바로가기

Algorithm/Programers - C++

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

문제

 

 

풀이

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

using namespace std;

vector<vector<int>> set_v(int a, int b){
    vector < vector <int> > v;
    int n = 1;
    for(int i=0; i<a; i++){
        vector<int> ve;
        for(int j=0; j<b; j++){
            ve.push_back(n++);
        }
        v.push_back(ve);
    }
    return v;
}

//x1, y1, x2, y2
//세로가 X, 가로가 Y
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    vector<vector<int>> v = set_v(rows, columns);
    
    int min = 0;
    int temp, before, len, x, y, x1, x2, y1,y2;
    for(auto q : queries){
        min = 100;
        x1 = q[0]; y1 = q[1];
        x2 = q[2]; y2 = q[3];
        len = (x2-x1+1) * (y2-y1+1) - (x2-x1-1) * (y2-y1-1);
        x = q[0]-1; y = q[1]-1;
        before = v[x][y++];
        min = before;
        for(int i=0; i<len+1; i++){
            temp = v[x][y];
            v[x][y] = before;
            before = temp;
            if(x == q[0]-1){ // ->
                if(y+1 > q[3]-1) x++;
                else y++;
            }
            
            else if(y == q[3]-1){ // 밑
                if(x+1 > q[2]-1) y--;
                else x++;
            }
            
            else if(x == q[2]-1){ //<-
                if(y-1 < q[1]-1) x--;
                else y--;
            }
            
            else if(y == q[1]-1){// 위
                if(x-1 < q[0]-1) y++;
                else x--; 
            }
            if(temp < min) min = temp;

        }
        if(temp < min) min = temp;
        answer.push_back(min);
        min = 100;
        
        
    }
    return answer;
}

 

 

 


다른 사람 풀이

 

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    int field[101][101];

    for (int i = 1 ; i <= rows ; i++)
    {
        for (int j = 1 ; j <= columns ; j++)
        {
            field[i][j] = (i - 1) * columns + j;
        }
    }


    for (int i = 0 ; i < (int)queries.size() ; i++)
    {
        int mini = field[queries[i][0]][queries[i][1]];
        int temp = field[queries[i][0]][queries[i][1]];

        for (int j = queries[i][0] ; j < queries[i][2] ; j++)
        {
            field[j][queries[i][1]] = field[j + 1][queries[i][1]];
            mini = min(mini, field[j][queries[i][1]]);
        }

        for (int j = queries[i][1] ; j < queries[i][3] ; j++)
        {
            field[queries[i][2]][j] = field[queries[i][2]][j + 1];
            mini = min(mini, field[queries[i][2]][j]);
        }

        for (int j = queries[i][2] ; j > queries[i][0] ; j--)
        {
            field[j][queries[i][3]] = field[j - 1][queries[i][3]];
            mini = min(mini, field[j][queries[i][3]]);
        }

        for (int j = queries[i][3] ; j > queries[i][1] ; j--)
        {
            field[queries[i][0]][j] = field[queries[i][0]][j - 1];
            mini = min(mini, field[queries[i][0]][j]);
        }

        field[queries[i][0]][queries[i][1] + 1] = temp;

        answer.push_back(mini);
    }


    return answer;
}

 

내 코드보다 훨씬 가독성도 좋고, 변수도 덜 사용했다.

나는 for문을 돌 때마다 if문을 사용해 위치를 확인했는데, 이 코드는 if문 없이 위치별로(?) 반복문을 돌며 배열을 회전시켰다. 따라서 나처럼 회전시키기 위해 변수가 두 개(temp, before)나 필요하지 않다!

 

가독성 좋은 코드... 나도 만들수 있도록 노력하자...