-
[16935] 배열 돌리기 3BOJ 2022. 1. 26. 03:50
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
<문제>
상하반전은 생각보다 쉬워서 잘 안나오는것 같기도 하지만, 2차원 배열을 회전하는건 종종 나온다.
매번 2차원 배열을 복사해두면 상대적으로 간단하게 구현이 가능하다.
1~4번은 그래도 자주 나올법한 구현이라 그대로 구현했지만,
6번연산처럼 한쪽만 구현하고 반대쪽을 3번 호출하는 방법도 있다.
<소스코드>
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576#include <bits/stdc++.h>using namespace std;int n, m, r, a[101][101];void op1(void) { //상하반전int i, j, temp[101][101];memcpy(temp, a, sizeof(a));for (i = 0; i < n; i++)for (j = 0; j < m; j++) a[i][j] = temp[n - 1 - i][j];}void op2(void) { //좌우반전int i, j, temp[101][101];memcpy(temp, a, sizeof(a));for (i = 0; i < n; i++)for (j = 0; j < m; j++) a[i][j] = temp[i][m - 1 - j];}void op3(void) { //시계방향 회전int i, j, R, C, temp[101][101];memcpy(temp, a, sizeof(a));for (i = 0, C = 0; i < m; i++, C++)for (j = 0, R = n - 1; j < n; j++, R--) a[i][j] = temp[R][C];swap(n, m);}void op4(void) { //반시계방향 회전int i, j, R, C, temp[101][101];memcpy(temp, a, sizeof(a));for (i = 0, C = m - 1; i < m; i++, C--)for (j = 0, R = 0; j < n; j++, R++) a[i][j] = temp[R][C];swap(n, m);}void op5(void) {int i, j, k, temp[101][101];memcpy(temp, a, sizeof(a));int y[4] = {0, 0, n / 2, n / 2}, x[4] = {0, m / 2, m / 2, 0};for (k = 0; k < 4; k++) {int cy = y[k], cx = x[k];int idx = (k == 3) ? 0 : k + 1;int ny, nx;for (i = cy, ny = y[idx]; i < (cy + (n / 2)); i++, ny++)for (j = cx, nx = x[idx]; j < (cx + (m / 2)); j++, nx++)a[ny][nx] = temp[i][j];}}void op6(void) {op5();op5();op5();}int main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cin >> n >> m >> r;int i, j;for (i = 0; i < n; i++)for (j = 0; j < m; j++) cin >> a[i][j];for (i = 0; i < r; i++) {int op;cin >> op;if (op == 1)op1();else if (op == 2)op2();else if (op == 3)op3();else if (op == 4)op4();else if (op == 5)op5();else if (op == 6)op6();}for (i = 0; i < n; i++) {for (j = 0; j < m; j++) cout << a[i][j] << ' ';cout << '\n';}return 0;}cs 'BOJ' 카테고리의 다른 글
[2216] 문자열과 점수 (0) 2022.01.29 [1505] 불 켜기 (0) 2022.01.26 [4375] 1 (0) 2022.01.26 [17471] 게리맨더링 (0) 2022.01.25 [1113] 수영장 만들기 (0) 2022.01.23