728x90
https://www.acmicpc.net/problem/16926
16926번: 배열 돌리기 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]
www.acmicpc.net
요즘 이 문제가 코테에 많이 등장하고 있다고 한다. 이번에는 이 배열 돌리기를 한번 쭉 풀어보도록 하겠다!!
(어떻게 하면 더 효율적으로 할 수 있을까...🤔)
가장 바깥 테두리 회전 - 그 안의 가장 바깥 테두리 회전 [반복]
테두리에서부터 중앙까지의 depth를 계산해서 인덱스를 다룰 수 있다.
n과 m 중 작은 값을 2로 나눈 값과 n과 m 중 작은 값을 2로 나눈 나머지를 더하면 depth가 된다.
테두리에는 left/bottom/right/top 이렇게 돌아가면서 while문을 사용해서 돌릴 수 있다!
#include <iostream>
#include <algorithm>
#define MAX 301
using namespace std;
int r, c, t, arr[MAX][MAX];
void Rotation(){
int depth = (min(r, c) / 2) + (min(r, c) % 2);
for(int i=0; i<depth; i++){
int curx = i; int cury = i;
int cur = arr[curx][cury];
//left부분은 아래로 이동
while(curx < r - 1 - i){
int next = arr[curx+1][cury]; //아래 값
arr[curx+1][cury] = cur; //아래칸에 현재 값 넣기
cur = next; //현재값에 아래값 넣기
curx++; //아래로 이동
}
//btm부분은 오른쪽으로 이동
while(cury < c - 1 - i){
int next = arr[curx][cury+1]; //오른쪽 값
arr[curx][cury+1] = cur;
cur = next;
cury++;
}
//right부분은 위로 이동
while(curx >= i+1){
int next = arr[curx-1][cury];
arr[curx-1][cury] = cur;
cur = next;
curx--;
}
//top부분은 왼쪽으로 이동
while(cury >= i+1){
int next = arr[curx][cury-1];
arr[curx][cury-1] = cur;
cur = next;
cury--;
}
}
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> r >> c >> t;
for(int i=0; i<r; i++) for(int j=0; j<c; j++) cin >> arr[i][j];
while(t--) Rotation();
for(int i=0; i<r; i++){
for(int j=0; j<c; j++)
cout << arr[i][j] << ' ';
cout << '\n';
}
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 10799번: 쇠막대기 (0) | 2022.05.12 |
---|---|
[백준/c++] 10812번: 바구니 순서 바꾸기 (0) | 2022.05.11 |
[백준/c++] 2776번: 암기왕 (0) | 2022.05.03 |
[백준/c++] 2573번: 빙산 (0) | 2022.05.02 |
[백준/c++] 14503번: 로봇 청소기 (0) | 2022.04.29 |