반응형
알고리즘 종류
- 구현
사고 과정
- 색이 같은 영역에서 회전을 시킨다.
1. 각 영역마다 (가로 길이 - 1) * 2 + (세로 길이 -1) * 2를 하면 1바퀴를 돌게 된다. 즉, 이 값으로 회전 횟수 r을 나눈 나머지가 유의미하게 회전할 횟수이다.
2. 유의미한 회전 횟수를 구한 후, 회전 횟수 만큼 각 변을 회전시킨다.
3. 하나의 영역이 완료되면, 내부 영역으로 옮기고 1번부터 다시 수행한다.
구현(C++)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#include <iostream>
using namespace std;
int n, m, r;
int mat[301][301];
void print(){
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cout << mat[i][j] << " ";
}
cout << endl;
}
}
void solution(){
// 꼭지점 4개
int y1 = 0;
int x1 = 0;
int y2 = n-1;
int x2 = 0;
int y3 = n-1;
int x3 = m-1;
int y4 = 0;
int x4 = m-1;
// 가장 바깥 영역부터 안으로 들어가기
while((y1 < y2) && (x1 < x4)){
// 영역 내에서 의미있게 회전할 횟수 구하기
int move = r % ((y2-y1)*2 + (x4-x1)*2);
while(move--){
// 회전 시키기
int tmp = mat[y1][x1];
// 위쪽 변
for(int j=x1; j<x4; j++){
mat[y1][j] = mat[y1][j+1];
}
for(int i=y4; i<y3; i++){
mat[i][x4] = mat[i+1][x4];
}
for(int j=x3; j>x2; j--){
mat[y3][j] = mat[y3][j-1];
}
for(int i=y2; i>y1; i--){
mat[i][x2] = mat[i-1][x2];
}
mat[y1+1][x1] = tmp;
}
// 회전이 끝났으면, 영역 옮기기
y1 += 1;
x1 += 1;
y2 -= 1;
x2 += 1;
y3 -= 1;
x3 -= 1;
y4 += 1;
x4 -= 1;
}
print();
}
int main(void){
cin >> n >> m >> r;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cin >> mat[i][j];
}
}
solution();
}
|
cs |
시행착오
반응형
'코딩 공부 > 백준' 카테고리의 다른 글
[백준][C++] 1300 k번째 수 (0) | 2021.02.13 |
---|---|
[백준][C++] 1544 소수의 연속합 (0) | 2021.02.13 |
[백준][C++] 16926 배열 돌리기 1 (0) | 2021.02.11 |
[백준][C++] 2437 저울 (0) | 2021.02.08 |
[백준][C++] 17472 다리 만들기 2 (0) | 2021.02.07 |