ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [16935] 배열 돌리기 3
    BOJ 2022. 1. 26. 03:50

    https://www.acmicpc.net/problem/16935

     

    16935번: 배열 돌리기 3

    크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 →

    www.acmicpc.net

    <문제>

    상하반전은 생각보다 쉬워서 잘 안나오는것 같기도 하지만, 2차원 배열을 회전하는건 종종 나온다.

    매번 2차원 배열을 복사해두면 상대적으로 간단하게 구현이 가능하다.

    1~4번은 그래도 자주 나올법한 구현이라 그대로 구현했지만,

    6번연산처럼 한쪽만 구현하고 반대쪽을 3번 호출하는 방법도 있다.

     

    <소스코드>

    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
    #include <bits/stdc++.h>
    using namespace std;
    int n, m, r, a[101][101];
    void op1(void) {  //상하반전
        int i, j, temp[101][101];
        memcpy(temp, a, sizeof(a));
        for (i = 0; i < n; i++)
            for (j = 0; j < m; j++) a[i][j] = temp[n - 1 - i][j];
    }
    void op2(void) {  //좌우반전
        int i, j, temp[101][101];
        memcpy(temp, a, sizeof(a));
        for (i = 0; i < n; i++)
            for (j = 0; j < m; j++) a[i][j] = temp[i][m - 1 - j];
    }
    void op3(void) {  //시계방향 회전
        int i, j, R, C, temp[101][101];
        memcpy(temp, a, sizeof(a));
        for (i = 0, C = 0; i < m; i++, C++)
            for (j = 0, R = n - 1; j < n; j++, R--) a[i][j] = temp[R][C];
        swap(n, m);
    }
    void op4(void) {  //반시계방향 회전
        int i, j, R, C, temp[101][101];
        memcpy(temp, a, sizeof(a));
        for (i = 0, C = m - 1; i < m; i++, C--)
            for (j = 0, R = 0; j < n; j++, R++) a[i][j] = temp[R][C];
        swap(n, m);
    }
    void op5(void) {
        int i, j, k, temp[101][101];
        memcpy(temp, a, sizeof(a));
        int y[4= {00, n / 2, n / 2}, x[4= {0, m / 2, m / 20};
        for (k = 0; k < 4; k++) {
            int cy = y[k], cx = x[k];
            int idx = (k == 3) ? 0 : k + 1;
            int ny, nx;
            for (i = cy, ny = y[idx]; i < (cy + (n / 2)); i++, ny++)
                for (j = cx, nx = x[idx]; j < (cx + (m / 2)); j++, nx++)
                    a[ny][nx] = temp[i][j];
        }
    }
    void op6(void) {
        op5();
        op5();
        op5();
    }
    int main(void) {
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        cin >> n >> m >> r;
        int i, j;
        for (i = 0; i < n; i++)
            for (j = 0; j < m; j++cin >> a[i][j];
        for (i = 0; i < r; i++) {
            int op;
            cin >> op;
            if (op == 1)
                op1();
            else if (op == 2)
                op2();
            else if (op == 3)
                op3();
            else if (op == 4)
                op4();
            else if (op == 5)
                op5();
            else if (op == 6)
                op6();
        }
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++cout << a[i][j] << ' ';
            cout << '\n';
        }
        return 0;
    }
    cs

     

    'BOJ' 카테고리의 다른 글

    [2216] 문자열과 점수  (0) 2022.01.29
    [1505] 불 켜기  (0) 2022.01.26
    [4375] 1  (0) 2022.01.26
    [17471] 게리맨더링  (0) 2022.01.25
    [1113] 수영장 만들기  (0) 2022.01.23

    댓글