오답노트
[시뮬레이션] BOJ 16935번 배열 돌리기 3 본문
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";
}
}
'C,C++ > 코딩테스트' 카테고리의 다른 글
[시뮬레이션] BOJ 16927 배열 돌리기 2 - 오답노트 (0) | 2022.05.26 |
---|---|
[시뮬레이션] BOJ 16926번 배열 돌리기 1 (0) | 2022.05.25 |
[BFS] BOJ 13549번 숨바꼭질 3 (0) | 2022.05.22 |
[BFS] BOJ 13913번 숨박꼭질 4 (0) | 2022.05.22 |
[그래프] BOJ 2667번 단지번호붙이기 (0) | 2022.05.21 |