https://www.acmicpc.net/problem/16926
시간 제한 | 메모리 제한 | solved.ac 티어 |
1초 | 512MB | 실버1 |
크기가 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]
↓ ↓ ↑ ↑
A[3][1] A[3][2] → A[3][3] → A[3][4] A[3][5]
↓ ↑
A[4][1] → A[4][2] → A[4][3] → A[4][4] → A[4][5]
예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.
1 2 3 4 2 3 4 8 3 4 8 6
5 6 7 8 1 7 7 6 2 7 8 2
9 8 7 6 → 5 6 8 2 → 1 7 6 3
5 4 3 2 9 5 4 3 5 9 5 4
<시작> <회전1> <회전2>
배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.
입력
첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.
둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.
출력
입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.
제한
- 2 ≤ N, M ≤ 300
- 1 ≤ R ≤ 1,000
- min(N, M) mod 2 = 0
- 1 ≤ Aij ≤ 108
그냥 돌리자. 다만 돌릴때 한 껍데기(?)부터 돌려야 하는 것을 잊지 말자.
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
int n, m, r;
vector<vector<int>> board;
void input() {
cin >> n >> m >> r;
board.resize(n);
fill(board.begin(), board.end(), vector<int>(m));
for(auto& row : board) for(auto& x : row) cin >> x;
}
void sol() {
while(r--) {
for (int start = 0; start < min(n, m) / 2; start++) {
int x = start, y = start;
int prev = board[y][x];
int next;
// 좌상 -> 좌하
while(y < n - start - 1) {
next = board[y + 1][x];
board[++y][x] = prev;
prev = next;
}
// 좌하 -> 우하
while(x < m - start - 1) {
next = board[y][x + 1];
board[y][++x] = prev;
prev = next;
}
// 우하 -> 우상
while(y >= start + 1) {
next = board[y - 1][x];
board[--y][x] = prev;
prev = next;
}
// 우상 -> 좌상
while(x >= start + 1) {
next = board[y][x - 1];
board[y][--x] = prev;
prev = next;
}
}
}
for(auto& row : board) {
for(auto& x : row) {
cout << x << ' ';
}
cout << endl;
}
}
int main () {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
input();
sol();
}
'coding_test > BAEKJOON' 카테고리의 다른 글
백준 7795번 C++ 풀이 (0) | 2022.05.26 |
---|---|
백준 1966번 C++ 풀이 (0) | 2022.05.22 |
백준 16194번 C++ 풀이 (0) | 2022.05.22 |
백준 3273번 C++ 풀이 (0) | 2022.05.22 |
백준 1339번 C++ 풀이 (0) | 2022.05.22 |