문제
크기가 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 ≤ 1,000
- min(N, M) mod 2 = 0
- 1 ≤ Aij ≤ 108
구현해야할 조건
배열의 반대방향으로 돌리는 것이고 안에 있는 값까지 돌리는 것이기 때문에 구현하기엔 좀 까다롭다고 생각한다. 생각하기 전에는 생각 후에는 1사분면부터 4사분면으로 생각한 꼭지점에 맞춰서 점점 줄어든다고 생각하면 된다!
말이 어렵다고 느껴진다면 내 잘못이니 코드를 보도록 합시다!
#include<iostream>
#define MAX 300 + 1
using namespace std;
int N,M,R;
int map[MAX][MAX];
int main()
{
cin >> N >> M >> R;
for(int i = 0; i < N; i++)
{
for(int j = 0; j < M; j++)
{
cin >> map[i][j];
}
}
while(R--)
{
int four_x = 0;
int four_y = 0;
// 4
int one_x = 0;
int one_y = M-1;
// 1
int two_x = N-1;
int two_y = M-1;
// 2
int three_x = N-1;
int three_y = 0;
// 3
while(four_x < three_x && four_y < one_y) // 4사랑 3사랑 안돼 4사랑 1사랑 안돼
{
int temp = map[four_x][four_y];
for(int i = four_y; i < one_y; i++)
{
map[four_x][i] = map[four_x][i+1];
}
for(int i = one_x; i < two_x; i++)
{
map[i][one_y] = map[i+1][one_y];
}
for(int i = two_y; i > three_y; i--)
{
map[two_x][i] = map[two_x][i-1];
}
for(int i = three_x; i > four_x; i--)
{
map[i][three_y] = map[i-1][three_y];
}
map[four_x+1][three_y] = temp;
four_x += 1;
four_y += 1;
one_x += 1;
one_y -= 1;
two_x -= 1;
two_y -= 1;
three_x -= 1;
three_y += 1;
}
}
for(int i = 0 ; i < N; i++)
{
for(int j = 0; j < M; j++)
{
cout << map[i][j] << " ";
}
cout << "\n";
}
return 0;
}
'PS > BaekJoon' 카테고리의 다른 글
[백준/c++] 16935 배열 돌리기 3 (0) | 2022.03.11 |
---|---|
[백준/c++] 16927 배열 돌리기 2 (0) | 2022.03.10 |
[백준/c++] 1697 숨바꼭질 (0) | 2022.03.10 |
[백준/c++] 7576 토마토 (0) | 2022.03.09 |
[백준/c++] 2667 단지번호붙이기 (0) | 2022.03.09 |