알고리즘/백준

[백준/c++] 16935번: 배열 돌리기 3

녕이 2022. 8. 5. 15:47
728x90

 

 

https://www.acmicpc.net/problem/16935

 

16935번: 배열 돌리기 3

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 →

www.acmicpc.net

 

 

연산 모두를.. 다 구현해내면 된다.

이런 문제는 예제를 하나 잡고 규칙을 찾으면 된다.

 

 

#include <iostream>
#include <algorithm>
using namespace std;
int n, m, r;
int arr[101][101];

void one(){
    for(int i=0; i<n/2; i++) for(int j=0; j<m; j++) swap(arr[i][j], arr[n-1-i][j]);
}

void two(){
    for(int i=0; i<n; i++) for(int j=0; j<m/2; j++) swap(arr[i][j], arr[i][m-1-j]);
}

void three(){ //right 90
    int h = n;
    swap(n, m);
    int tmp[n][m];
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            tmp[i][j] = arr[h-1-j][i];
        }
    }
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++){
            arr[i][j] = tmp[i][j];
        }
    }
}

void four(){ //left 90
    int w = m;
    swap(n,m);
    int tmp[n][m];
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            tmp[i][j] = arr[j][w-1-i];
        }
    }
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++){
            arr[i][j] = tmp[i][j];
        }
    }
}

void five(){
    int N = n/2;
    int M = m/2;
    int tmp[n][m];
    
    //1->2 : ++j
    for(int i=0; i<N; i++){
        for(int j=0; j<M; j++){
            tmp[i][j+M] = arr[i][j];
        }
    }
    //2->3 : ++i
    for(int i=0; i<N; i++){
        for(int j=M; j<m; j++){
            tmp[i+N][j] = arr[i][j];
        }
    }
    //3->4 : --j
    for(int i=N; i<n; i++){
        for(int j=M; j<m; j++){
            tmp[i][j-M] = arr[i][j];
        }
    }
    //4->1 : --i
    for(int i=N; i<n; i++){
        for(int j=0; j<M; j++){
            tmp[i-N][j] = arr[i][j];
        }
    }
    
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            arr[i][j] = tmp[i][j];
        }
    }
}

void six(){
    int N = n/2;
    int M = m/2;
    int tmp[n][m];
    
    //1->4 : ++i
    for(int i=0; i<N; i++){
        for(int j=0; j<M; j++){
            tmp[i+N][j] = arr[i][j];
        }
    }
    //4->3 : ++j
    for(int i=N; i<n; i++){
        for(int j=0; j<M; j++){
            tmp[i][j+M] = arr[i][j];
        }
    }
    //3->2 : --i
    for(int i=N; i<n; i++){
        for(int j=M; j<m; j++){
            tmp[i-N][j] = arr[i][j];
        }
    }
    //2->1 : --j
    for(int i=0; i<N; i++){
        for(int j=M; j<m; j++){
            tmp[i][j-M] = arr[i][j];
        }
    }
    
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            arr[i][j] = tmp[i][j];
        }
    }
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> m >> r;
    for(int i=0; i<n; i++) for(int j=0; j<m; j++) cin >> arr[i][j];
    
    while(r--){
        int op;
        cin >> op;
        switch (op) {
            case 1:
                one();
                break;
            case 2:
                two();
                break;
            case 3:
                three();
                break;
            case 4:
                four();
                break;
            case 5:
                five();
                break;
            case 6:
                six();
                break;
            default:
                break;
        }
    }
    
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cout << arr[i][j] << ' ';
        }
        cout << '\n';
    }
    return 0;
}

 

 

 

728x90