BOJ 16935 : 배열 돌리기 3

·2023년 6월 9일
0

알고리즘 문제 풀이

목록 보기
147/165
post-thumbnail

문제링크

풀이요약

구현

풀이상세

  1. 1,2 의 경우는 행 혹은 열을 반전시킨다.

  2. 3,4 의 경우는 NNMM 서로 스왑한 후, 행 혹은 열을 반전시킨다. 물론 NNMM 이 서로 바뀐 상태이기에, 반전 시 {i,j} 형태가 아닌 {j,i} 형태로 배치한다.

  3. 5,6 의 경우는 전체배열을 N/2,M/2N/2, M/2 기준으로 나누어 4분할 한 후, {0,0} ~ {N-1, M-1} 까지 알맞게 배치한다.

#include <iostream>
using namespace std;
int a[104][104], tmp[104][104], N, M, R;

void input() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> N >> M >> R;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> a[i][j];
        }
    }
}

void copyMap() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            a[i][j] = tmp[i][j];
        }
    }
}

void solve1() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            tmp[i][j] = a[N - i - 1][j];
        }
    }
    copyMap();
}

void solve2() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            tmp[i][j] = a[i][M - j - 1];
        }
    }
    copyMap();
}

void solve3() {
    swap(N, M);
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            tmp[i][j] = a[M - j - 1][i];
        }
    }
    copyMap();
}

void solve4() {
    swap(N, M);
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            tmp[i][j] = a[j][N - i - 1];
        }
    }
    copyMap();
}

void solve5() {
    for (int i = 0; i < N / 2; i++) {
        for (int j = 0; j < M / 2; j++) {
            tmp[i][j] = a[i+N/2][j];
        }
        for (int j = 0; j < M / 2; j++) {
            tmp[i][j+M/2] = a[i][j];
        }
    }

    for(int i=N/2; i<N; i++) {
        for(int j=M/2; j<M; j++) {
            tmp[i][j-M/2] = a[i][j];
        }
        for(int j=M/2; j<M; j++) {
            tmp[i][j] = a[i-N/2][j];
        }
    }
    copyMap();
}

void solve6() {
    for(int i=0; i<N/2; i++) {
        for(int j=0; j<M/2; j++) {
            tmp[i][j] = a[i][j+M/2];
        }
        for(int j=0; j<M/2; j++) {
            tmp[i][j+M/2] = a[i+N/2][j+M/2];
        }
    }

    for(int i=N/2; i<N; i++) {
        for(int j=M/2; j<M; j++) {
            tmp[i][j-M/2] = a[i-N/2][j-M/2];
        }
        for(int j=M/2; j<M; j++) {
            tmp[i][j] = a[i][j-M/2];
        }
    }
    copyMap();
}

void go() {
    int num;
    for (int i = 0; i < R; i++) {
        cin >> num;
        switch (num) {
            case 1 :
                solve1();
                break;
            case 2 :
                solve2();
                break;
            case 3 :
                solve3();
                break;
            case 4 :
                solve4();
                break;
            case 5 :
                solve5();
                break;
            case 6 :
                solve6();
                break;
        }
    }
}

void output() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cout << a[i][j] << " ";
        }
        cout << "\n";
    }
}

int main() {
    input();
    go();
    output();
}
profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글