본문 바로가기

백준

16935 배열 돌리기 3

즌쯔 개쁙츠느..

 

어렵지는 않았는데 너무 귀찮고 복잡하고 생각하기 머리 아팠다

 

 

이 문제 코딩부터 하면 백퍼 꼬인다 싶어서 먼저 적어놓고 풀었다.

 

1 - 4번까지는 괜찮았음 근데 5 - 6번이 눈물난다... ㅠ_____ㅜ

 

 

그림처럼 순서 적어가면서 구현했다.

 

구현은 tmp 배열을 하나 만든 다음에 이 배열에 변경한 배열을 옮겨둔다.

 

다 끝나면 다시 tmp배열에 있던 걸 v에 옮긴다.

 

이 문제 한 번 틀릴 뻔했는데 3번처럼 n * m이  m * n 형태로 바뀌는 걸 고려 안 했다. 

 

수정하고 나서는 문제 없었음

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>

#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()

using namespace std;
using i64 = long long;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;

int v[105][105];
int n, m;

void print()
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            printf("%d ", v[i][j]);
        }
        printf("\n");
    }
}

void func1()
{
    int tmp[105][105];

    for (int i = n - 1, k = 0; i >= 0; i--, k++)
    {
        for (int j = 0, l = 0; j < m; j++, l++)
            tmp[k][l] = v[i][j];
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            v[i][j] = tmp[i][j];
    }
}

void func2()
{
    int tmp[105][105];

    for (int i = 0, k = 0; i < n; i++, k++)
    {
        for (int j = m-1, l = 0; j >= 0; j--, l++)
            tmp[k][l] = v[i][j];
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            v[i][j] = tmp[i][j];
    }
}

void func3()
{
    int tmp[105][105];

    for (int i = 0, k = 0; i < m; i++, k++)
    {
        for (int j = n-1, l = 0; j >= 0; j--, l++)
            tmp[k][l] = v[j][i];
    }

    int t = n;
    n = m;
    m = t;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            v[i][j] = tmp[i][j];
    }
}

void func4()
{
    int tmp[105][105];

    for (int i = m - 1, k = 0; i >= 0; i--, k++)
    {
        for (int j = 0, l = 0; j < n; j++, l++)
            tmp[k][l] = v[j][i];
    }

    int t = n;
    n = m;
    m = t;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            v[i][j] = tmp[i][j];
    }
}

void func5()
{
    int tmp[105][105];
    bool ligth = true;

    for (int i = 0, k = 0, l = 0; i < n / 2; )
    {
        for (int j = 0; j < m / 2; j++, l++)
        {
            if (ligth)
                tmp[k][l] = v[i + n / 2][j];
            else
                tmp[k][l] = v[i][j];
        }
        if (ligth)
            ligth = false;
        else
        {
            ligth = true;
            l = 0;
            k++;
            i++;
        }
    }

    ligth = true;
    for (int i = 0, k = n / 2, l = 0; i < n / 2; )
    {
        for (int j = m / 2; j < m; j++, l++)
        {
            if (ligth)
                tmp[k][l] = v[i + n / 2][j];
            else
                tmp[k][l] = v[i][j];
        }
        if (ligth)
            ligth = false;
        else
        {
            ligth = true;
            l = 0;
            i++;
            k++;
        }
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            v[i][j] = tmp[i][j];
    }
}

void func6()
{
    int tmp[105][105];
    bool ligth = false;

    for (int i = 0, k = 0, l = 0; i < n / 2; )
    {
        for (int j = m / 2; j < m; j++, l++)
        {
            if (ligth)
                tmp[k][l] = v[i + n / 2][j];
            else
                tmp[k][l] = v[i][j];
        }
        if (!ligth)
            ligth = true;
        else
        {
            ligth = false;
            l = 0;
            k++;
            i++;
        }
    }

    ligth = false;
    for (int i = 0, k = n / 2, l = 0; i < n / 2; )
    {
        for (int j = 0; j < m / 2; j++, l++)
        {
            if (ligth)
                tmp[k][l] = v[i + n / 2][j];
            else
                tmp[k][l] = v[i][j];
        }
        if (!ligth)
            ligth = true;
        else
        {
            ligth = false;
            l = 0;
            i++;
            k++;
        }
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            v[i][j] = tmp[i][j];
    }
}

int     main()
{
    int r;
    cin >> n >> m >> r;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cin >> v[i][j];
    }

    for (int i = 0; i < r; i++)
    {
        int a;
        cin >> a;

        switch (a)
        {
        case 1:
            func1();
            break;
        case 2:
            func2();
            break;
        case 3:
            func3();
            break;
        case 4:
            func4();
            break;
        case 5:
            func5();
            break;
        case 6:
            func6();
            break;
        }
    }

    print();

    return 0;
}

'백준' 카테고리의 다른 글

16926 배열 돌리기 1  (0) 2020.09.19
17502 클레어와 팰린드롬  (0) 2020.09.19
1012 유기농 배추  (0) 2020.09.16
1094 막대기  (0) 2020.09.16
6246 풍선 놀이  (0) 2020.09.16