백준 Baekjoon

[C언어] 백준 16926 : 배열 돌리기 1

sujo 2020. 9. 29. 02:32

백준 16926 : 배열 돌리기 1

 

문제 링크

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

 

 

문제 내용

크기가 NxM인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다.

 

 

Idea

처음엔 나름의 규칙을 찾아 연산하려 했으나... 복잡하여 그냥 하나씩 옮겼다.

아래 코드의 규칙은 다음과 같다.

  1. 가장 바깥쪽부터 회전시킨다.
  2. 왼쪽, 위, 오른쪽, 아래 순서로 한칸씩 옮겨준다. 

 

idx : 제일 바깥쪽부터 0, 안으로 들어갈수록 1씩 추가

 

 

Code

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
#include <stdio.h>
 
int arr[300][300];
 
void rotate(int n, int m, int r, int idx) {
    int i, j, x, y;
    //r만큼 한칸씩 옮기기
    while (r--) {
        j = idx;
        x = n - 2+idx, y = idx;
        int tmp = arr[idx+- 1][idx];
 
        //왼쪽 부분
        for (i = idx+- 1; i > idx; i--) {
            arr[i][j] = arr[x][y];
            x--;
        }
 
        //윗 부분
        x = idx; y = idx + 1;
        for (j = idx; j < m-1+idx; j++) {
            arr[i][j] = arr[x][y];
            y++;
        }
 
        //오른쪽 부분
        x = 1+idx; y = m - 1 + idx;
        for (i = idx; i < n - 1+idx; i++) {
            arr[i][j] = arr[x][y];
            x++;
        }
 
        //아랫 부분
        x = n - 1+idx; y = m - 2+idx;
        for (j = m - 1+idx; j > 1+idx; j--) {
            arr[i][j] = arr[x][y];
            y--;
        }
        arr[i][j] = tmp;
    }
 
}
 
int main() {
    int N, M, R;
    scanf("%d %d %d"&N, &M, &R);
 
    //배열 입력받기
    for (int i = 0; i < N; i++)
        for (int j = 0; j < M; j++)
            scanf("%d"&arr[i][j]);
 
    int idx = 0, n = N, m = M;
    while (1) {
        //회전 수를 한바퀴 기준으로 모드 연산
        int r = R % (2 * n + 2 * m - 4);
        rotate(n, m, R, idx);
        idx++;
        n -= 2;
        m -= 2;
        if (n == 0 || m == 0break;
    }
 
    //결과 출력
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++)
            printf("%d ", arr[i][j]);
        printf("\n");
    }
 
    return 0;
}
cs