오답노트
[시뮬레이션] BOJ 16927 배열 돌리기 2 - 오답노트 본문
https://www.acmicpc.net/problem/16927
16927번: 배열 돌리기 2
크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]
www.acmicpc.net
-문제 파악
배열돌리기1 의 시간복잡도 버전
- 나의 접근
배열을 돌렸을 때 첫번째 배열로 돌아오는 수를 찾아서 문제에서 주어지는 돌리는 횟수를 나눈 나머지 만큼만 돌릴려고 했지만, 돌아오는 수가 너무 큰건지 계속 런타임 오류가 발생했다.
- 정답
그래서 가장 바깥 배열부터 차례대로 위의 접근 방식을 적용하기로 했다.
(나의 접근 : 주어진 배열 전부가 처음으로 돌아오는 횟수로 나머지를 찾는 방법
정 답 : 주어진 배열을 바깥쪽부터 처음으로 돌아오는 횟수로 나머지를 찾고 안쪽으로 넘어가는 방법 )
각 구역의 배열을 돌려서 처음으로 돌아오는 횟수는 2*(n-(2*k)) + 2*(m-(2*k)) 이다. (n,m은 문제에서 주어진 가로,세로 길이이고 k는 0부터 시작하여 안쪽의 배열을 돌릴때 마다 1씩 증가한다.
#include "bits/stdc++.h"
using namespace std;
int n, m, t;
int arr[305][305];
int arr_tmp[305][305];
void T2B(int x, int y, int dn, int dm)
{
for (int i = x; i < dn - 1; i++)
{
arr_tmp[i + 1][y] = arr[i][y];
}
}
void L2R(int x, int y, int dn, int dm)
{
for (int i = y; i < dm - 1; i++)
{
arr_tmp[x][i + 1] = arr[x][i];
}
}
void B2T(int x, int y, int dn, int dm)
{
for (int i = dn - 1; i > x; i--)
{
arr_tmp[i - 1][y] = arr[i][y];
}
}
void R2L(int x, int y, int dn, int dm)
{
for (int i = dm - 1; i > y; i--)
{
arr_tmp[x][i - 1] = arr[x][i];
}
}
void arrcpy(int dx, int dy, int dn, int dm)
{
int ndx = n - dx - 1;
int ndy = m - dy - 1;
for (int i = dx; i < dn; i++)
{
arr[i][dy] = arr_tmp[i][dy];
}
for (int i = dy; i < dm; i++)
{
arr[ndx][i] = arr_tmp[ndx][i];
}
for (int i = dn - 1; i >= dx; i--)
{
arr[i][ndy] = arr_tmp[i][ndy];
}
for (int i = dm - 1; i >= dy; i--)
{
arr[dx][i] = arr_tmp[dx][i];
}
}
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 dn = n;
int dm = m;
int dx = 0;
int dy = 0;
int k = 0;
while (dx < dn && dy < dm )
{
int nt = 2 * (n - (2 * k)) + 2 * (m - (2 * k)) - 4;
int nR = t % nt;
while (nR--)
{
T2B(dx, dy, dn, dm);
L2R(n - dx - 1, dy, dn, dm);
B2T(dx, m - dy - 1, dn, dm);
R2L(dx, dy, dn, dm);
arrcpy(dx, dy, dn, dm);
//memcpy(arr, arr_tmp, sizeof(int) * 305 * 305);
}
k++;
dx++;
dy++;
dn--;
dm--;
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << arr[i][j] << " ";
}
cout << "\n";
}
}
'C,C++ > 코딩테스트' 카테고리의 다른 글
[시뮬레이션] BOJ 16967번 배열 복원하기 (0) | 2022.05.26 |
---|---|
[시뮬레이션] BOJ 16931번 겉넓이 구하기 (0) | 2022.05.26 |
[시뮬레이션] BOJ 16926번 배열 돌리기 1 (0) | 2022.05.25 |
[시뮬레이션] BOJ 16935번 배열 돌리기 3 (0) | 2022.05.24 |
[BFS] BOJ 13549번 숨바꼭질 3 (0) | 2022.05.22 |