반응형

https://www.acmicpc.net/problem/16927

 

16927번: 배열 돌리기 2

크기가 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번을 모두 다 회전해야할 필요는 없습니다.
둘레의 깊이가 d일 때,
(n - 1 - d * 2) * 2 + (m - 1 - d * 2) * 2)번 회전할 때마다
원래의 위치로 돌아오게 됩니다.
따라서 각 둘레마다 r을 위 값으로 나눈 나머지 횟수만큼만 회전해주면 됩니다. 

 

#include <iostream>
#define MAX 300
using namespace std;

int n, m, r, arr[MAX][MAX];

void rotate() {
	int d = 0;
	while (d < (n+1) / 2 && d < (m+1) / 2) {
		int rr = r % (2 * n + 2 * m - 4 - 8 * d);
		while (rr--) {
			int temp = arr[d][d];
			for (int i = d; i < m - 1 - d; i++)
				arr[d][i] = arr[d][i + 1];
			for (int i = d; i < n - 1 - d; i++)
				arr[i][m - 1 - d] = arr[i + 1][m - 1 - d];
			for (int i = m - 1 - d; i > d; i--)
				arr[n - 1 - d][i] = arr[n - 1 - d][i - 1];
			for (int i = n - 1 - d; i > d; i--)
				arr[i][d] = arr[i - 1][d];
			arr[d + 1][d] = temp;
		}
		d++;
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> n >> m >> r;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> arr[i][j];
		}
	}

	rotate();

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << arr[i][j] << " ";
		}
		cout << "\n";
	}
}
반응형

'Algorithm' 카테고리의 다른 글

백준 4796 : 캠핑  (0) 2021.11.16
백준 1774 : 우주신과의 교감  (0) 2021.11.16
백준 1926 : 그림  (0) 2021.11.15
백준 14490 : 백대열  (0) 2021.11.15
백준 1197 : 최소 스패닝 트리  (0) 2021.11.15

+ Recent posts