본문 바로가기

코드포스

[코드포스 Practice21] C. Little Artem and Matrix

으으 문제 이해가 안 돼서 막혔었다.

 

이거 type에 따라서 동작하는 건 알겠는데 이 타입으로 뭘 하라는 건지 몰랐다. 

 

알고보니 원본 배열을 구하라는 문제였다.

 

뒤에서 부터 3이면 집어넣고 1,2면 값 shift하고.. 끝~~

 

이거 시간복잡도 구하는 거 착각해서 n이 100이고 q가 10000이라 두 개 곱하면 백만이고 백만은 N*longN이 되어야 겠군... 

 

엄청 고민했는데 알고보니 Q*n이라 백만이고, 1초에 2억까지 가능해서 오케..

 

그냥 주어진 문장대로 작동하면 되는 문제였다. 허허

 

 


아ㅋㅋㅋ 이거 잘 짜다가 쿼리 거꾸로 입력받는거에서 좀 어려웠음ㅋㅋㅋㅋ

 

벡터 배열 만들어서 어찌저찌 입력 받았다. 후..

 

코포한테 C++실력 시험 받는 기분이었음.

 

자네 이차원 벡터 함수 인자로 보낼 수 있나?

 

vector<vector<int>> shift_col(vector<vector<int>> &v, int p) 이렇게 &붙여서 보내면 됨니다

 

입력 거꾸로 받는 건 할 수 있겠나?

 

vector<int> v[q]; 이게 벡터 배열이고 여기에 값을 저장해서 사용할 것입니다.

 

와우 그래도 이걸 짰다는게 놀랍다

 

세상사람들~~~ 제가 벡터 배열을 만들었어요~~~~~~

 

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define xx first
#define yy second
 
using namespace std;
using i64 = long long;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;

int n, m;

void print_vec(vector<vector<int>> &v)
{
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cout << v[i][j] << " ";
        }
        cout << endl;
    }
}

vector<vector<int>> shift_row(vector<vector<int>> &v, int p)
{
    v[p][0] = v[p][m];
    
    for (int i = m; i > 0; i--)
    {
        v[p][i] = v[p][i-1];
    }
    
    return v;
}

vector<vector<int>> shift_col(vector<vector<int>> &v, int p)
{
    v[0][p] = v[n][p];
    
    for (int i = n; i > 0; i--)
    {
        v[i][p] = v[i-1][p];
    }
    
    return v;
}

int main() {
    int q;
    scanf("%d %d %d", &n, &m, &q);
    
    vector<vector<int>> ans(n+1, vector<int>(m+1, 0));
    
    vector<int> v[q];
    
    for (int i = 0; i < q; i++)
    {
        int in;
        scanf("%d", &in);
        v[i].push_back(in);
        
        int max_num;
        if (in == 1 || in == 2)
            max_num = 1;
        else
            max_num = 3;
        
        for (int j = 1; j <= max_num; j++)
        {
            scanf("%d", &in);
            v[i].push_back(in);
        }
    }
    
    for (int i = q-1; i >= 0; i--)
    {
        if (v[i][0] == 1)
        {
            shift_row(ans, v[i][1]);
        }
        else if (v[i][0] == 2)
        {
            shift_col(ans, v[i][1]);
        }
        else
        {
            int r = v[i][1], c = v[i][2], x = v[i][3];
            ans[r][c] = x;
        }
    }
    
    print_vec(ans);
    
    return 0;
}

 

 

 

예아