반응형
알고리즘 종류
- 회전
사고 과정
1. 회전 횟수만큼 while을 반복한다.
2. 4개의 꼭지점을 찾고, 꼭지점이 사각형을 이룰 때까지 while을 반복한다.
3. 4개의 변에서 값을 시계방향으로 한 칸씩 이동시킨다.
구현(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
|
#include <iostream>
#include <vector>
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;
}
}
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];
// 회전 횟수
while(r--){
// 각 꼭지점 위치
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 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();
}
|
cs |
시행착오
- 회전류의 문제는 나를 혼란스럽게 하는 문제이다. 아직 나만의 풀이 방법을 적립하지 못했기 때문이라고 생각한다. 그래서 방향, 이동 거리, 회전 횟수 등과 같은 조건들을 알고리즘으로 아직 설계하지 못하고 있다. 가장 큰 이유는 문제를 적게 풀어봤기 때문이라고 생각한다. 이 배열 돌리기 문제는 시리즈로 구성되어 있으니 모두 풀어보자.
반응형
'코딩 공부 > 백준' 카테고리의 다른 글
[백준][C++] 1544 소수의 연속합 (0) | 2021.02.13 |
---|---|
[백준][C++] 16927 배열 돌리기 2 (0) | 2021.02.12 |
[백준][C++] 2437 저울 (0) | 2021.02.08 |
[백준][C++] 17472 다리 만들기 2 (0) | 2021.02.07 |
[백준][C++] 12015 가장 증가하는 부분 수열 2 (0) | 2021.02.06 |