[백준 C++] 16926 배열 돌리기1

이성훈·2022년 3월 31일
0
post-custom-banner

문제

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다.
예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.
배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.

입력

첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.

둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.

출력

입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다

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

풀이

입력받은 배열 A를 회전한 배열 B를 만들건데,
여기서 회전하는것이 배열의 외곽부터 내부로 한줄한줄 돌릴것인데,
이 과정에서 배열B를 여러번 check하게되면 시간초과가 나게된다.

필자의경우 배열A의 최외곽부터 안으로 한줄한줄 돌린다음,
한줄돌린결과를 배열B에 저장, 그리고 바로 배열 B를 배열 A로 복사했다.
여기서 배열B에서 배열 A로 복사할때, 배열 B의 모든원소를 check하면 시간초과가나고, 배열A의 한외곽씩 건드린 코드를 그대로 사용하여 복사하는 코드로 사용했다.
이 부분이 배열 V로 배열A를 돌려서 저장하는부분,

이부분이 배열B를 다시 배열A로 복사하는 부분이다.
보면 맨위의 코드와 같은코드를 사용한다. ㅇㅇ

#define _CRT_SECURE_NO_WARNINGS 
#include <bits/stdc++.h>
int n, m, r, dir, **A, **B, min;
int dx[] = { 1, 0, -1, 0 };
int dy[] = { 0, 1, 0, -1 };
void rotate(int start_x, int start_y, int R, int C);
void func();
void printAll(int**& C);
void init();

void init() {
	scanf("%d%d%d", &n, &m, &r);
	if (n > m)
		min = m;
	else
		min = n;
	A = new int* [n];
	B = new int* [n];
	for (int i = 0; i < n; i++) {
		A[i] = new int[m];
		B[i] = new int[m];
		for (int j = 0; j < m; j++)
			scanf("%d", &A[i][j]);
	}
}

void printAll(int **&C) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++)
			printf("%d ", C[i][j]);
		printf("\n");
	}
}

void func() {
	while (r--) {
		for (int k = 0; k < min / 2; k++) {
			dir = 0;
			rotate(k, k, n - 2 * k, m - 2 * k);
		}
	}

	printAll(B);
}

void rotate(int start_x, int start_y, int R, int C) {
	int x = start_x;
	int y = start_y;
	int end_x = start_x + R;
	int end_y = start_y + C;
	int cnt = 2 * (R - 1) + 2 * (C - 1);
	while (cnt--) {
		int xx = x + dx[dir];
		int yy = y + dy[dir];
		if (xx < start_x || yy < start_y || xx == end_x || yy == end_y) {
			dir = (dir + 1) % 4;
			xx = x + dx[dir];
			yy = y + dy[dir];
		}
		int num = A[x][y];
		B[xx][yy] = num;
		x = xx;
		y = yy;
	}
	x = start_x;
	y = start_y;
	end_x = start_x + R;
	end_y = start_y + C;
	cnt = 2 * (R - 1) + 2 * (C - 1);
	while (cnt--) {
		int xx = x + dx[dir];
		int yy = y + dy[dir];
		if (xx < start_x || yy < start_y || xx == end_x || yy == end_y) {
			dir = (dir + 1) % 4;
			xx = x + dx[dir];
			yy = y + dy[dir];
		}
		A[xx][yy] = B[xx][yy];
		x = xx;
		y = yy;
	}
}

int main(void) {
	init();
	func();

	return 0;
}
profile
I will be a socially developer
post-custom-banner

0개의 댓글