https://www.acmicpc.net/problem/16926
배열 돌리기 시리즈 첫번째 문제입니다.
N, M이 최대 300으로 값이 그리 크지 않으므로, 정말 하나하나 다 돌려보면 답이 나옵니다.
가장 바깥부터 해서 R만큼 돌린 위치에 값을 저장하는 식으로 코드를 작성해 보았습니다.
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
int A[303][303];
int B[303][303];
const int mx[] = { +1, +0, -1, +0 };
const int my[] = { +0, +1, +0, -1 };
int main() {
int N, M, R;
scanf("%d%d%d", &N, &M, &R);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &A[i][j]);
}
}
pii p[4];
int sero = N - 1;
int garo = M - 1;
int round = 2 * (sero + garo);
int stage = 0;
p[0].first = p[0].second = stage;
p[1].first = sero;
p[1].second = stage;
p[2].first = sero;
p[2].second = garo;
p[3].first = stage;
p[3].second = garo;
while (garo > 0 && sero > 0) {
// Process (Write to B)
int rotate = R % round;
int sx, sy, dx, dy;
sx = dx = p[0].first;
sy = dy = p[0].second;
int d1, d2;
d1 = d2 = 0;
for (int i = 0; i < rotate; i++) {
dx += mx[d2];
dy += my[d2];
if (dx == p[(d2 + 1) % 4].first && dy == p[(d2 + 1) % 4].second) {
d2 = (d2 + 1) % 4;
}
}
for (int i = 0; i < round; i++) {
B[dx][dy] = A[sx][sy];
sx += mx[d1];
sy += my[d1];
if (sx == p[(d1 + 1) % 4].first && sy == p[(d1 + 1) % 4].second) {
d1 = (d1 + 1) % 4;
}
dx += mx[d2];
dy += my[d2];
if (dx == p[(d2 + 1) % 4].first && dy == p[(d2 + 1) % 4].second) {
d2 = (d2 + 1) % 4;
}
}
// Process End
sero -= 2;
garo -= 2;
round -= 8;
stage += 1;
p[0].first = p[0].second = stage;
p[1].first = stage + sero;
p[1].second = stage;
p[2].first = stage + sero;
p[2].second = stage + garo;
p[3].first = stage;
p[3].second = stage + garo;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
printf("%d", B[i][j]);
if (j + 1 < M) putchar(' ');
}
putchar('\n');
}
}
'알고리즘 & Problem Solving' 카테고리의 다른 글
Google Kickstart Round G 2019 후기 (2) | 2019.10.20 |
---|---|
백준 14501번 퇴사 문제 풀이 (0) | 2019.09.27 |
백준 17472번 다리 만들기 2 문제 풀이 (0) | 2019.09.24 |
백준 17471번 게리맨더링 문제 풀이 (3) | 2019.09.20 |
삼성 SW 역량 테스트(A형)에 관하여... (4) | 2019.08.26 |