코딩 공부/백준

[백준][C++] 16927 배열 돌리기 2

김 정 환 2021. 2. 12. 20:40
반응형

 

 

 

알고리즘 종류

    - 구현

 

 

 

사고 과정

    - 색이 같은 영역에서 회전을 시킨다.

        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