백준문제풀이

백준 문제 16926번 배열 돌리기 1 문제풀이 c++

노가다 김씨 2022. 2. 25. 09:20

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

문제해석

문제에 나온 그대로 R번 배열을 돌린후 결과를 출력하면 끝인 심플한문제이다.

그런데 구현하는건 생각보다 심플하지않았다...

원형으로 생각하고 큐를 사용하였다.

예를들어 위 그림처럼 배열이 있으면 주황색 화살표가 지나간 부분을 q[0]에 넣고

빨간색 화살표가 지나간부분을 q[1]에 넣고

파란색 화살표가 지나간 부분을 q[2]에 넣고 

...

...

끝날때까지 반복한다.

그후에 큐의 맨앞 원소를 맨뒤로 넣어주는걸 R번 반복하고

q[0]를 front부터 빌때까지 순서대로 주황색 화살표가 지나간 부분에 다시 넣어주고

q[1]을 front부터 빌때까지 순서대로 빨간색 화살표가 지나간 부분에 다시 넣어주고

...

...

끝날때까지 반복한후에 배열을 출력하면 끝난다.

뭐 이런 아이디어를 바탕으로 아래와 같이 코드를 구현하였다.

 

#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
queue <int> q[150];
int a[300][300];
int main(){
    cout.tie(NULL);
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    int n,m,r;
    cin>>n>>m>>r;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            cin>>a[i][j];
        }
    }
    int flag=0;
    int start_y=0;
    int start_x=0;
    int start_z=0;
    int y=start_y; int x=start_x; int z=start_z;
    for(int i=0; i<n*m; i++)
    {
        q[z].push(a[y][x]);
        if(y==z&&x==m-1-z)
        {
            flag=1;
        }
        else if(y==n-1-z&&x==m-1-z)
        {
            flag=2;
        }
        else if(y==n-1-z&&x==z)
        {
            flag=3;
        }
        else if(y==start_y+1&&x==start_x)
        {
            start_y++;
            start_x++;
            flag=0;
            z++;
        }
        if(flag==0)
        {
            x++;
        }
        else if(flag==1)
        {
            y++;
        }
        else if(flag==2)
        {
            x--;
        }
        else if(flag==3)
        {
            y--;
        }
    }
    while(r>0)
    {
        for(int i=0; i<round(min(n,m)/2); i++)
        {
            int tmp=q[i].front();
            q[i].pop();
            q[i].push(tmp);
        }
        r--;
    }
    ///////
    ///////
    flag=0;
    start_y=0;
    start_x=0;
    start_z=0;
    y=start_y; x=start_x; z=start_z;
    for(int i=0; i<n*m; i++)
    {
        a[y][x]=q[z].front();
        q[z].pop();
        if(y==z&&x==m-1-z)
        {
            flag=1;
        }
        else if(y==n-1-z&&x==m-1-z)
        {
            flag=2;
        }
        else if(y==n-1-z&&x==z)
        {
            flag=3;
        }
        else if(y==start_y+1&&x==start_x)
        {
            start_y++;
            start_x++;
            flag=0;
            z++;
        }
        if(flag==0)
        {
            x++;
        }
        else if(flag==1)
        {
            y++;
        }
        else if(flag==2)
        {
            x--;
        }
        else if(flag==3)
        {
            y--;
        }
    }
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<"\n";
    }
}

flag는 방향을 나타내는 변수로서 사용했다.