https://www.acmicpc.net/problem/16926
실버 1 구현 문제인데 어떻게 풀어야할지 오랫동안 감이 잡히지 않았다.
이렇게 패턴이 있는 문제는 시작점을 찾아야한다.
r == c 가 시작점이다.
해당 시작점은 min(N, M) / 2 까지이다.
(1, 1), (2, 2), ... , (min(N, M) / 2, min(N, M) / 2) 가 시작점이다.
해당 시작점을 기준으로 4군데로 나눌 수 있다.
1. 오른쪽 원소를 받아오는 top
2. 위쪽 원소를 받아오는 left
3. 왼쪽 원소를 받아오는 bottom
4. 아래쪽 원소를 받아오는 right
예외 처리는 다음과 같다.
1. top 중에서 가장 오른쪽 원소는 오른쪽에서 원소를 받아오지 않는다.
2. left 중에서 가장 위쪽 원소는 위쪽 원소를 받아오지 않는다.
3. bottom 중에서 가장 왼쪽 원소는 왼쪽 원소를 받아오지 않는다.
4. right 중에서 가장 아래쪽 원소는 아래쪽에서 원소를 받아오지 않는다.
이와 같이 코드를 짜면 아래와 같다.
//BOJ_16926 배열 돌리기 1 [실버 1]
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int N, M, R;
int arr[302][302];
void simulate() {
int tmp[302][302];
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
tmp[i][j] = arr[i][j];
}
}
for (int k = 1; k <= min(N, M) / 2; k++) {
int flag = 1; // 1 : 좌, 2 : 상, 3 : 우, 4: 하
// top, bottom
for (int j = k; j <= M - k + 1; j++) {
if (j != M- k + 1) arr[k][j] = tmp[k][j + 1];
if (j != k) arr[N - k + 1][j] = tmp[N - k + 1][j - 1];
}
// right, left
for (int i = k; i <= N - k + 1; i++) {
if (i != N - k + 1) arr[i][M - k + 1] = tmp[i + 1][M - k + 1];
if (i != k) arr[i][k] = tmp[i - 1][k];
}
}
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> N >> M >> R;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> arr[i][j];
}
}
while (R--) {
simulate();
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cout << arr[i][j] << ' ';
}
cout << '\n';
}
}