백준 16935번 배열 돌리기 3 문제풀이(C++)

YooHeeJoon·2023년 1월 23일
0

백준 문제풀이

목록 보기
45/56

백준 16935번 배열 돌리기 3

아이디어

  1. 상하 반전
void upside_down(vector<vector<int>>& arr, const int n)
{
	for (int i = 0; i < n / 2; i++)
	{
		swap(arr[i], arr[n - i - 1]);
	}
}
  1. 좌우 반전
void reverse_left_right(vector<vector<int>>& arr, const int n, const int m)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m / 2; j++)
		{
			swap(arr[i][j], arr[i][m - j - 1]);

		}
	}
}
  1. 오른쪽으로 90도 회전
void degree90_right(vector<vector<int>>& arr, int& n, int& m)
{
	vector<vector<int>>tmp(m, vector<int>(n));
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			tmp[j][n - i - 1] = arr[i][j];
		}
	}
	arr.swap(tmp);
	swap(n, m);
}
  1. 왼쪽으로 90도 회전
void degree90_left(vector<vector<int>>& arr, int& n, int& m)
{
	vector<vector<int>>tmp(m, vector<int>(n));
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			tmp[m - j - 1][i] = arr[i][j];
		}
	}
	arr.swap(tmp);
	swap(n, m);
}
  1. 4개 구역 시계방향으로 회전
void rotate_clockwise(vector<vector<int>>& arr, const int n, const int m)
{
	const int y = n / 2, x = m / 2;
	for (int i = 0; i < y; i++)
	{
		for (int j = 0; j < x; j++)
		{
			swap(arr[i][j], arr[i][j + x]);
			swap(arr[i][j], arr[i + y][j + x]);
			swap(arr[i][j], arr[i + y][j]);
		}
	}
}
  1. 4개 구역 반시계 방향으로 회전
void rotate_counterclockwise(vector<vector<int>>& arr, const int n, const int m)
{
	const int y = n / 2, x = m / 2;
	for (int i = 0; i < y; i++)
	{
		for (int j = 0; j < x; j++)
		{
			swap(arr[i][j], arr[i + y][j]);
			swap(arr[i][j], arr[i + y][j + x]);
			swap(arr[i][j], arr[i][j + x]);
		}
	}
}

정답 코드

#include<bits/stdc++.h>
using namespace std;
#define FAST_IO ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr)

void upside_down(vector<vector<int>>& arr, const int n)
{
	for (int i = 0; i < n / 2; i++)
	{
		swap(arr[i], arr[n - i - 1]);
	}
}

void reverse_left_right(vector<vector<int>>& arr, const int n, const int m)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m / 2; j++)
		{
			swap(arr[i][j], arr[i][m - j - 1]);

		}
	}
}
void degree90(vector<vector<int>>& arr, int& n, int& m, const int cal)
{
	vector<vector<int>>tmp(m, vector<int>(n));
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (cal == 3)
				tmp[j][n - i - 1] = arr[i][j];
			else
				tmp[m - j - 1][i] = arr[i][j];

		}
	}
	arr.swap(tmp);
	swap(n, m);
}

void swap_clockwise(int& a, int& b, int& c, int& d)
{
	swap(a, b);
	swap(a, c);
	swap(a, d);
}
void swap_counterclockwise(int& a, int& b, int& c, int& d)
{
	swap(a, d);
	swap(a, c);
	swap(a, b);
}
void rotate(vector<vector<int>>& arr, const int n, const int m, const int cal)
{
	void(*_swap)(int&, int&, int&, int&) = cal == 5 ? swap_clockwise : swap_counterclockwise;
	const int y = n / 2, x = m / 2;
	for (int i = 0; i < y; i++)
	{
		for (int j = 0; j < x; j++)
		{
			_swap(arr[i][j], arr[i][j + x], arr[i + y][j + x], arr[i + y][j]);
		}
	}
}
void rotate(const int cal, vector<vector<int>>& arr, int& n, int& m)
{
	switch (cal)
	{
	case 1:upside_down(arr, n); break;
	case 2:reverse_left_right(arr, n, m); break;
	case 3: case 4:degree90(arr, n, m, cal); break;
	case 5: case 6:rotate(arr, n, m, cal); break;
	default:break;
	}
}

int main() {
	FAST_IO;
	int n, m, r; cin >> n >> m >> r;
	vector<vector<int>> arr(n, vector<int>(m));
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> arr[i][j];
		}
	}
	while (r--)
	{
		int cal; cin >> cal;
		rotate(cal, arr, n, m);
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cout << arr[i][j] << ' ';
		}
		cout << '\n';
	}
	return 0;
}

0개의 댓글