알고리즘/백준

[백준/c++] 16926번: 배열 돌리기 1

녕이 2022. 5. 11. 16:53
728x90

 

 

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

 

16926번: 배열 돌리기 1

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]

www.acmicpc.net

 

요즘 이 문제가 코테에 많이 등장하고 있다고 한다. 이번에는 이 배열 돌리기를 한번 쭉 풀어보도록 하겠다!!

(어떻게 하면 더 효율적으로 할 수 있을까...🤔)

 

가장 바깥 테두리 회전 - 그 안의 가장 바깥 테두리 회전 [반복]

테두리에서부터 중앙까지의 depth를 계산해서 인덱스를 다룰 수 있다.

n과 m 중 작은 값을 2로 나눈 값과 n과 m 중 작은 값을 2로 나눈 나머지를 더하면 depth가 된다.

 

테두리에는 left/bottom/right/top 이렇게 돌아가면서 while문을 사용해서 돌릴 수 있다!

 

#include <iostream>
#include <algorithm>
#define MAX 301
using namespace std;
int r, c, t, arr[MAX][MAX];

void Rotation(){
    int depth = (min(r, c) / 2) + (min(r, c) % 2);
    
    for(int i=0; i<depth; i++){
        int curx = i; int cury = i;
        int cur = arr[curx][cury];
        
        //left부분은 아래로 이동
        while(curx < r - 1 - i){
            int next = arr[curx+1][cury]; //아래 값
            arr[curx+1][cury] = cur; //아래칸에 현재 값 넣기
            cur = next; //현재값에 아래값 넣기
            curx++; //아래로 이동
        }
        //btm부분은 오른쪽으로 이동
        while(cury < c - 1 - i){
            int next = arr[curx][cury+1]; //오른쪽 값
            arr[curx][cury+1] = cur;
            cur = next;
            cury++;
        }
        //right부분은 위로 이동
        while(curx >= i+1){
            int next = arr[curx-1][cury];
            arr[curx-1][cury] = cur;
            cur = next;
            curx--;
        }
        //top부분은 왼쪽으로 이동
        while(cury >= i+1){
            int next = arr[curx][cury-1];
            arr[curx][cury-1] = cur;
            cur = next;
            cury--;
        }
    }
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> r >> c >> t;
    for(int i=0; i<r; i++) for(int j=0; j<c; j++) cin >> arr[i][j];
    while(t--) Rotation();
    for(int i=0; i<r; i++){
        for(int j=0; j<c; j++)
            cout << arr[i][j] << ' ';
        cout << '\n';
    }
    return 0;
}

 

 

 

728x90