오답노트

[시뮬레이션] BOJ 16935번 배열 돌리기 3 본문

C,C++/코딩테스트

[시뮬레이션] BOJ 16935번 배열 돌리기 3

권멋져 2022. 5. 24. 19:21
https://www.acmicpc.net/problem/16935
 

16935번: 배열 돌리기 3

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 →

www.acmicpc.net

- 문제 파악

문제에서 요구하는 배열 돌리는 기능을 구현하여 입력으로 주어지는 NxM 배열을 돌린 결과를 출력하라

 

- 정답

 

#include "bits/stdc++.h"

using namespace std;

int arr[104][104];
int n, m, t;

void func1() // 상하 반전
{
	int k = n / 2;
	int arr_tmp[104] = { 0, };

	for (int i = 0; i < k; i++)
	{
		memcpy(arr_tmp, arr[i], sizeof(int) * m);
		int tmp = n - i - 1;
		memcpy(arr[i], arr[tmp], sizeof(int) * m);
		memcpy(arr[tmp], arr_tmp, sizeof(int) * m);

	}
	

}

void func2() // 좌우 반전
{
	for (int i = 0; i < n; i++)
	{
		reverse(arr[i], arr[i] + m);
	}
}

void func3() // 오른쪽 90도 회전
{
	int arr_tmp[104][104] = { 0, };
	for (int j = 0; j < m; j++)
	{
		int k = 0;
		int tmp[104];
		for (int i = n - 1; i >= 0; i--)
		{
			tmp[k++] = arr[i][j];
		}
		memcpy(arr_tmp[j], tmp, sizeof(int) * n);
	}

	memcpy(arr, arr_tmp, sizeof(int) * (104 * 104));

}

void func4() // 왼쪽 90도 회전
{
	int arr_tmp[104][104] = { 0, };
	int t = 0;
	for (int j = m-1; j >= 0; j--, t++)
	{
		int k = 0;
		int tmp[104];
		for (int i = 0; i < n; i++)
		{
			tmp[k++] = arr[i][j];
		}
		memcpy(arr_tmp[t], tmp, sizeof(int) * n);
	}

	memcpy(arr, arr_tmp, sizeof(int) * (104 * 104));

}

int arr_tmp[104][104] = { 0, };
void func56_right(int x) // 1/4 개의 배열을 오른쪽으로 이동
{
	for (int i = x; i < n / 2 + x; i++)
		memcpy(arr_tmp[i] + m / 2, arr[i], sizeof(int) * m/2);
}

void func56_left(int x) // 1/4 개의 배열을 왼쪽으로 이동
{
	for (int i = x; i < n / 2 + x; i++)
		memcpy(arr_tmp[i] , arr[i] + m / 2, sizeof(int) * m / 2);
}

void func56_up(int y) // 1/4 개의 배열을 위로 이동
{
	for (int i = 0; i < n / 2; i++)
		memcpy(arr_tmp[i] + y, arr[n/2 + i] + y, sizeof(int) * m / 2);
}

void func56_down(int y) // 1/4 개의 배열을 아래로 이동
{
	for (int i = n / 2; i < n; i++)
		memcpy(arr_tmp[i] + y, arr[i - n / 2] + y, sizeof(int) * m / 2);
}

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

	
	cin >> n >> m >> t;


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


	
	while (t--)
	{
		int nCmd;
		cin >> nCmd;

		int tmp = n;

		switch (nCmd)
		{
		case 1:
			func1();
			break;
		case 2:
			func2();
			break;
		case 3:
			func3();		
			n = m;
			m = tmp;
			break;
		case 4:
			func4();
			n = m;
			m = tmp;
			break;
		case 5:
			func56_right(0);//1 -> 2
			func56_down(m / 2);//2 -> 3
			func56_left(n / 2);//3 -> 4
			func56_up(0);//4 -> 1
			memcpy(arr, arr_tmp, sizeof(int) * (104 * 104));
			break;
		case 6:
			func56_down(0);//1 -> 4
			func56_right(n / 2);//4 -> 3
			func56_up(m / 2);//3 -> 2
			func56_left(0);//2 -> 1
			memcpy(arr, arr_tmp, sizeof(int) * (104 * 104));
			break;

		}
	}

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

}