16926번: 배열 돌리기 1

메모리

시간

1824 KB

284 ms

Code

#include <cstdio>
#include <algorithm>
using namespace std;

int arr[301][301];
int new_arr[301][301];
//위 오 왼 위
int xm[4] = {1, 0, -1, 0};
int ym[4] = {0, 1, 0, -1};

void	change(int n, int m, int count)
{
	for (int i = 0; i < count; i++)
	{
		int j = 0;
		int x = i;
		int y = i;
		while (1)
		{
			new_arr[x + xm[j]][y + ym[j]] = arr[x][y];
			x = x + xm[j];
			y = y + ym[j];
			if (x == i && y == i)
				break ;
			//방향이 꺾이는 조건
			if ((x == n - i && y == i) || (x == n - i && y == m - i) ||
				(x == i && y == m - i))
				j++;
		}
	}
}

int main()
{
	int n,m,r;
	scanf("%d%d%d",&n,&m,&r);
	//몇바꾸 돌건지
	int count = min(n,m)/2;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
			scanf("%d", &arr[i][j]);
	}
	for (int i = 0; i < r; i++)
	{
		change(n - 1,m - 1, count);
		for (int z = 0; z < n; z++)
		{
			for (int j = 0; j < m; j++)
				arr[z][j] = new_arr[z][j];
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
			printf("%d ", arr[i][j]);
		printf("\\n");
	}
	return 0;
}

문제 풀이

<삽질>

처음에 min(n,m)/2 를 구해 한 변씩 if 문으로 넣어가는 방식으로 구현했으나 놓치는 부분을 찾을 수 없어서 다시 구조를 짰다.

큰 사각형에서 한바퀴를 돌고 안쪽 사각형을 도는 방식으로 구현했다.

방향을 설정해주는 int xm[4] = {1, 0, -1, 0}; / int ym[4] = {0, 1, 0, -1}; 배열을 생성해 방향을 바꿀 조건을 만나면 다음인덱스로 넘어간다.

지속해서 바꿔주다 0,0 / 1,1 ... 등을 만나면 다음 사각형을 돌리는 방식으로 구현했다.

이차원 배열을 하나 더 선언해서 옮겨담는 방식으로 하였으나 비효율적이라 임시 int를 따로 선언해 넣어주는 방식이 더 좋은 구현일 것이다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2aa4c847-c0e2-4c60-9d83-488b8b69cd5d/CC18AC7D-C85D-4500-B107-9DCA77A5DA42.png