https://www.acmicpc.net/problem/17276
17276번: 배열 돌리기
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
www.acmicpc.net
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t;
cin >> t;
for (int test = 0; test < t; test++) {
int n;
int d;
int map[501][501];
cin >> n >> d;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> map[i][j];
}
}
//-90도 회전은 270도 회전한 것과 같음
if (d < 0) {
d += 360;
}
for (int deg = 0; deg < d; deg += 45) {
//바깥에서 안쪽 순으로
for (int i = 1; i <= n / 2; i++) {
pair<int, int> cur = {i, i};
int temp;
//cur의 값을 next에 덮어씌움, 원래의 next값은 temp에 저장
for (int cnt = 0; cnt < 8; cnt++) {
pair<int, int> next;
int hop = n / 2 - i + 1;
switch (cnt / 2) {
case 0:
next = {cur.first, cur.second + hop};
break;
case 1:
next = {cur.first + hop, cur.second};
break;
case 2:
next = {cur.first, cur.second -hop};
break;
case 3:
next = {cur.first - hop, cur.second};
break;
}
if (cnt == 0) {
temp = map[cur.first][cur.second];
}
swap(temp, map[next.first][next.second]);
cur = {next.first, next.second};
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cout << map[i][j] << " ";
}
cout << "\n";
}
}
return 0;
}
구현 문제이다.
대각선 혹은 가운데 행렬 간에만 연산이 일어나므로
좌상, 상, 우상, 우, 우하, 하, 좌하, 좌로 총 8번 수행한다.
정수 배열 X의 바깥쪽부터 안쪽 순으로 정 가운데 숫자를 제외하고 연산을 하게 된다.
앞서 말한 8개의 숫자를 돌리면서 시계 또는 반시계 방향으로 연산을 하면 된다.
임시 변수 temp를 하나 만들고 다음 위치의 숫자를 저장한 뒤 현재 위치의 값으로 덮어씌우는 연산을 반복하면 된다.
추가로 왼쪽으로 d만큼 돌리는 연산은 오른쪽으로 360-d만큼 돌리는 연산과 결과가 같으므로
d를 처리하여 반대로 도는 연산의 구현을 줄였다
'Coding Test' 카테고리의 다른 글
| 백준 1774 우주신과의 교감 (0) | 2024.03.25 |
|---|---|
| 백준 21919 소수 최소 공배수 (1) | 2024.03.25 |
| 백준 11000 강의실 배정 (0) | 2024.03.22 |
| 백준 17836 공주님을 구해라! (0) | 2024.03.21 |
| 백준 15486 퇴사 2 (2) | 2024.03.20 |