문제
크기가 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]
↓ ↓ ↑ ↑
A[3][1] A[3][2] → A[3][3] → A[3][4] A[3][5]
↓ ↑
A[4][1] → A[4][2] → A[4][3] → A[4][4] → A[4][5]
예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.
1 2 3 4 2 3 4 8 3 4 8 6
5 6 7 8 1 7 7 6 2 7 8 2
9 8 7 6 → 5 6 8 2 → 1 7 6 3
5 4 3 2 9 5 4 3 5 9 5 4
<시작> <회전1> <회전2>
배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.
입력
첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.
둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.
출력
입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.
제한
- 2 ≤ N, M ≤ 300
- 1 ≤ R ≤ 109
- min(N, M) mod 2 = 0
- 1 ≤ Aij ≤ 108
구현해야할 조건
배열돌리기 1과 비슷한데, 회전하는 수준이 다르다. 무슨 수준이 다르냐면 너무 많이 돌린다. 굳이 배열이 어느정도 배수가 넘어가면 제자리인데 돌릴 필요가 있을까? 이런 비판적인 사고가 필요하다. 난 터무니 없이 부족하다 비판적인 사고가 키워야하는데 ..
code
#include<iostream>
#include<algorithm>
#define MAX 300+1
using namespace std;
int n,m,r;
int arr[MAX][MAX];
void solution()
{
int y1 = 0;
int x1 = 0;
int y2 = n-1;
int x2 = 0;
int y3 = n-1;
int x3 = m-1;
int y4 = 0;
int x4 = m-1;
while((y1 < y2) && (x1 < x4))
{
int move = r % ((y2-y1)*2 + (x4-x1)*2); // moduler를 해줘야한다!!
while(move--)
{
int temp = arr[y1][x1];
for(int i = x1; i < x4; i++)
{
arr[y1][i] = arr[y1][i+1];
}
for(int i = y4; i < y3; i++)
{
arr[i][x4] = arr[i+1][x4];
}
for(int i = x3; i > x2; i--)
{
arr[y3][i] = arr[y3][i-1];
}
for(int i = y2; i > y1; i--)
{
arr[i][x2] = arr[i-1][x2];
}
arr[y1+1][x1] = temp;
}
y1 += 1;
x1 += 1;
y2 -= 1;
x2 += 1;
y3 -= 1;
x3 -= 1;
y4 += 1;
x4 -= 1;
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
}
int main()
{
cin >> n >> m >> r;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin >> arr[i][j];
solution();
return 0;
}
'PS > BaekJoon' 카테고리의 다른 글
[백준/c++] 1182 부분수열의 합 (0) | 2022.03.11 |
---|---|
[백준/c++] 16935 배열 돌리기 3 (0) | 2022.03.11 |
[백준/c++] 16926 배열 돌리기 1 (0) | 2022.03.10 |
[백준/c++] 1697 숨바꼭질 (0) | 2022.03.10 |
[백준/c++] 7576 토마토 (0) | 2022.03.09 |