백준 16935번 배열 돌리기 3
아이디어
- 상하 반전
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]);
}
}
}
- 오른쪽으로 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);
}
- 왼쪽으로 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);
}
- 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]);
}
}
}
- 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;
}
