Algorithm
[백준 16926] 배열 돌리기1
Mirab
2021. 10. 12. 04:51
문제 풀이
반시계 방향으로 배열을 돌리면 된다.
단순하게 생각해서 구현 문제이며, 어떻게 구현하냐에 따라 풀이가 제각각일 것 같다.
반시계 방향으로 배열을 돌린다고 생각할 때,
가장 바깥쪽부터 반시계 방향으로 회전하는 식으로 구현했다.
가장 바깥쪽 반시계 돌리기,
그다음 바깥쪽 반시계 돌리기,
언제까지? 좌표가 엇갈릴 때까지 돌려주면 된다.
바깥쪽의 구분은
왼쪽 대각선의 시작점 (sx, sy) 와 오른쪽 대각선 끝점 (ex, ey)를 기준으로 잡아서 시작과 끝을 구분했다.
엇갈린다는 것은 sx >= ex || sy >= ey 를 의미한다.
배열을 돌릴 때는
swap 개념을 이용해서 기존의 값을 임시 저장소 temp에 저장하고,
다 돌리고 나서 temp의 값을 넣어주면 된다.
이때 원소의 이동은 한 칸씩 옮겨주면 된다.
소스 코드
#include <iostream>
using namespace std;
const int MAX = 300 + 5;
int N, M, R;
int a[MAX][MAX];
void rotate()
{
int sx = 1, sy = 1;
int ex = N, ey = M;
while(sx < ex && sy < ey)
{
int temp = a[sx][sy];
//top
for(int i = sy + 1; i <= ey; i++)
{
a[sx][i-1] = a[sx][i];
}
//right
for(int i = sx + 1; i <= ex; i++)
{
a[i-1][ey] = a[i][ey];
}
//bottom
for(int i = ey; i >= sy + 1; i--)
{
a[ex][i] = a[ex][i-1];
}
//left
for(int i = ex; i >= sx + 1; i--)
{
a[i][sy] = a[i-1][sy];
}
a[sx+1][sy] = temp;
sx++;
sy++;
ex--;
ey--;
}
}
void printMatrix()
{
for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= M; j++)
{
cout << a[i][j] << ' ';
}
cout << '\n';
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M >> R;
for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= M; j++)
{
cin >> a[i][j];
}
}
for(int i = 0; i < R; i++)
rotate();
printMatrix();
return 0;
}