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] ↓ ↓ ↑ ↑ 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

www.acmicpc.net

 

배열 돌리기 시리즈 첫번째 문제입니다.

 

N, M이 최대 300으로 값이 그리 크지 않으므로, 정말 하나하나 다 돌려보면 답이 나옵니다.

 

가장 바깥부터 해서 R만큼 돌린 위치에 값을 저장하는 식으로 코드를 작성해 보았습니다.

 

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
int A[303][303];
int B[303][303];
const int mx[] = { +1, +0, -1, +0 };
const int my[] = { +0, +1, +0, -1 };
int main() {
	int N, M, R;
	scanf("%d%d%d", &N, &M, &R);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &A[i][j]);
		}
	}
	pii p[4];
	int sero = N - 1;
	int garo = M - 1;
	int round = 2 * (sero + garo);
	int stage = 0;

	p[0].first = p[0].second = stage;

	p[1].first = sero;
	p[1].second = stage;

	p[2].first = sero;
	p[2].second = garo;
	
	p[3].first = stage;
	p[3].second = garo;

	while (garo > 0 && sero > 0) {
		// Process (Write to B)
		int rotate = R % round;
		int sx, sy, dx, dy;
		sx = dx = p[0].first;
		sy = dy = p[0].second;
		int d1, d2;
		d1 = d2 = 0;
		for (int i = 0; i < rotate; i++) {
			dx += mx[d2];
			dy += my[d2];
			if (dx == p[(d2 + 1) % 4].first && dy == p[(d2 + 1) % 4].second) {
				d2 = (d2 + 1) % 4;
			}
		}
		for (int i = 0; i < round; i++) {
			B[dx][dy] = A[sx][sy];
			sx += mx[d1];
			sy += my[d1];
			if (sx == p[(d1 + 1) % 4].first && sy == p[(d1 + 1) % 4].second) {
				d1 = (d1 + 1) % 4;
			}
			dx += mx[d2];
			dy += my[d2];
			if (dx == p[(d2 + 1) % 4].first && dy == p[(d2 + 1) % 4].second) {
				d2 = (d2 + 1) % 4;
			}
		}

		// Process End
		sero -= 2;
		garo -= 2;
		round -= 8;
		stage += 1;
		p[0].first = p[0].second = stage;

		p[1].first = stage + sero;
		p[1].second = stage;

		p[2].first = stage + sero;
		p[2].second = stage + garo;

		p[3].first = stage;
		p[3].second = stage + garo;
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			printf("%d", B[i][j]);
			if (j + 1 < M) putchar(' ');
		}
		putchar('\n');
	}
}

+ Recent posts