백준 알고리즘 16935번 : 배열 돌리기 3

Zoo Da·2021년 12월 22일
0

백준 알고리즘

목록 보기
309/337
post-thumbnail

링크

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

sol1) 구현

#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define int int64_t
using namespace std;

int board[100][100],board2[100][100],n,m,r;

void upsideDown(){
  for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) board[i][j] = board2[n - 1 - i][j];
}

void leftToRight(){
  for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) board[i][j] = board2[i][m - 1 - j];
}

void rightRotate(){
  swap(m,n);
  for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) board[i][j] = board2[m - 1 - j][i];
}

void leftRotate(){
  swap(m,n);
  for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) board[i][j] = board2[j][n - 1 - i];
}

void rotateArea(){
  // 1번을 2번으로
  for(int i = 0; i < n >> 1; i++) for(int j = 0; j < m >> 1; j++){
    board[i][m / 2 + j] = board2[i][j];
  }
  // 2번을 3번으로
  for(int i = 0; i < n >> 1; i++) for(int j = m >> 1; j < m; j++){
    board[i + n / 2][j] = board2[i][j];
  }
  // 3번을 4번으로
  for(int i = n >> 1; i < n; i++) for(int j = m >> 1; j < m; j++){
    board[i][j - m / 2] = board2[i][j];
  }
  // 4번을 1번으로
  for (int i = 0; i < n >> 1; i++) for (int j = 0; j < m >> 1; j++) {
	  board[i][j] = board2[i + n / 2][j];
	}
}

void reverseRotateArea(){
  // 1번을 4번으로
  for(int i = 0; i < n >> 1; i++) for(int j = 0; j < m >> 1; j++){
    board[i + n / 2][j]= board2[i][j];
  }
  // 4번을 3번으로
  for(int i = n >> 1; i < n; i++) for(int j = 0; j < m >> 1; j++){
    board[i][j + m / 2] = board2[i][j];
  }
  // 3번을 2번으로
  for(int i = n >> 1; i < n; i++) for(int j = m >> 1; j < m; j++){
    board[i - n / 2][j] = board2[i][j];
  }
  // 2번을 1번으로
  for(int i = 0; i < n >> 1; i++) for(int j = m >> 1; j < m; j++){
    board[i][j - m / 2] = board2[i][j];
  }
}

int32_t main(){
  fastio;
  cin >> n >> m >> r;
  for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) cin >> board[i][j];
  while(r--){
    int q; cin >> q;
    for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) board2[i][j] = board[i][j];
    if(q == 1) upsideDown();
    else if(q == 2) leftToRight();
    else if(q == 3) rightRotate();
    else if(q == 4) leftRotate();
    else if(q == 5) rotateArea();
    else if(q == 6) reverseRotateArea();
  }
  for(int i = 0; i < n; i++){
    for(int j = 0; j < m; j++){
      cout << board[i][j] << ' ';
    }
    cout << "\n";
  }
}

그냥 문제에 써있는 데로 구현해주면 됩니다.

profile
메모장 겸 블로그

0개의 댓글