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는 방향을 나타내는 변수로서 사용했다.
'백준문제풀이' 카테고리의 다른 글
백준 문제 24390번 또 전자레인지야? 문제풀이 c++ (0) | 2022.03.01 |
---|---|
백준 문제 4386번 별자리 만들기 문제풀이 c++ (0) | 2022.03.01 |
백준 문제 3107번 IPv6 문제풀이 python (0) | 2022.02.25 |
백준 문제 14502번 연구소 문제풀이 c++ (0) | 2022.02.25 |
백준 문제 15712번 등비수열 문제풀이 c++ (0) | 2022.02.25 |