https://www.acmicpc.net/problem/16926
#include <iostream>
#include <algorithm>
using namespace std;
int arr[301][301];
int ny[4] = {0, 1, 0, -1};
int nx[4] = {1, 0, -1, 0};
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m, r;
cin >> n >> m >> r;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
//배열을 반시계방향으로 r회 회전하기
for (int rotate = 0; rotate < r; rotate++) {
for (int i = 0; i < min(n, m) / 2; i++) {
pair<int, int> cur = make_pair(i, i);
int temp = arr[i][i];
int k = 0;
while (k < 4) {
pair<int, int> next = make_pair(cur.first + ny[k], cur.second + nx[k]);
if (next.first == i && next.second == i) {
break;
}
//범위 확인
if (i <= next.first && n - i > next.first && i <= next.second && next.second < m - i) {
arr[cur.first][cur.second] = arr[next.first][next.second];
cur.first = next.first;
cur.second = next.second;
}
//범위를 넘어가면 방향 변경
else {
k++;
}
}
arr[i + 1][i] = temp;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << arr[i][j] << " ";
}
cout << "\n";
}
return 0;
}
구현 문제이다.
주어진 배열을 해당 숫자만큼 반시계 방향으로 돌리는 문제이다.
풀이
int ny[4] = {0, 1, 0, -1};
int nx[4] = {1, 0, -1, 0};
각 박스는 (i, i)에서 시작하여 반시계 방향으로 돌게 된다. 이를 해결하기 위해 시작 값을 미리 저장하고, 방향을 미리 설정한다.
//배열을 반시계방향으로 r회 회전하기
for (int rotate = 0; rotate < r; rotate++) {
for (int i = 0; i < min(n, m) / 2; i++) {
pair<int, int> cur = make_pair(i, i);
int temp = arr[i][i];
int k = 0;
while (k < 4) {
pair<int, int> next = make_pair(cur.first + ny[k], cur.second + nx[k]);
if (next.first == i && next.second == i) {
break;
}
//범위 확인
if (i <= next.first && n - i > next.first && i <= next.second && next.second < m - i) {
arr[cur.first][cur.second] = arr[next.first][next.second];
cur.first = next.first;
cur.second = next.second;
}
//범위를 넘어가면 방향 변경
else {
k++;
}
}
arr[i + 1][i] = temp;
}
}
시계 방향으로 돌아가면서 다음 값을 이전 값에 집어넣는다. 이 과정을 반복하다 배열의 범위를 넘어가면 방향을 바꾸어 이 과정을 반복한다. 값을 덮어씌우는 작업이므로 한 칸이 비므로 처음에 미리 저장해두었던 값을 집어넣는다.
'Coding Test' 카테고리의 다른 글
백준 10427 빚 (1) | 2024.05.25 |
---|---|
백준 2473 세 용액 (0) | 2024.05.24 |
백준 15961 회전 초밥 (0) | 2024.05.22 |
백준 17073 나무 위의 빗물 (1) | 2024.05.21 |
백준 1766 문제집 (0) | 2024.05.20 |