📍 문제 설명
https://www.acmicpc.net/problem/16935
💡 접근
문제에서 주어진대로 구현하는 문제... 시간이 좀 걸렸다.
👩💻 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int n, m, v, e, k, r, answer, cnt;
static int[] arr;
static long[] dp;
static int[][] board, result;
static boolean[][] visited;
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
static ArrayList<Integer> list;
static StringBuilder sb;
static Queue<Integer> q;
public static void main(String[] args) throws IOException {
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
r = Integer.parseInt(st.nextToken());
board = new int[n][m];
result = new int[n][m];
for(int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0; j < m; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
st = new StringTokenizer(br.readLine());
for(int i = 0; i < r; i++) {
switch (Integer.parseInt(st.nextToken())) {
case 1 : { // 상하 반전
upDown();
break;
}
case 2 : { // 좌우 반전
leftRight();
break;
}
case 3 : { // 오른쪽 90도 회전
rightRotation();
break;
}
case 4 : { // 왼쪽 90도 회전
leftRotation();
break;
}
case 5 : { // 부분 배열 4개로 나눈 후 1->2->3->4->1 이동
divideMove();
break;
}
case 6 : { // 부분 배열 4개로 나눈 후 1->4->3->2->1 이동
divideBackMove();
break;
}
}
}
sb = new StringBuilder();
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++){
sb.append(board[i][j] + " ");
}
sb.append("\n");
}
System.out.println(sb);
T.solution();
}
private static void upDown() {
result = new int[n][m];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
result[n-i-1][j] = board[i][j];
}
}
board = result;
}
private static void leftRight() {
result = new int[n][m];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
result[i][m-j-1] = board[i][j];
}
}
board = result;
}
private static void rightRotation() {
//크기가 달라진다. 8 6
result = new int[m][n];
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
result[i][j] = board[n-j-1][i];
}
}
int temp = n;
n = m;
m = temp;
board = result;
}
private static void leftRotation() {
//크기가 달라진다.
result = new int[m][n];
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
result[i][j] = board[j][m-i-1];
}
}
int temp = n;
n = m;
m = temp;
board = result;
}
private static void divideMove() {
result = new int[n][m];
int row = n / 2;
int col = m / 2;
//1->2
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
result[i][j+col] = board[i][j];
}
}
//2->3
for(int i = 0; i < row; i++) {
for(int j = col; j < m; j++) {
result[row+i][j] = board[i][j];
}
}
//3->4
for(int i = row; i < n; i++) {
for(int j = 0; j < col; j++) {
result[i][j] = board[i][j+col];
}
}
//4->1
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
result[i][j] = board[i+row][j];
}
}
board = result;
}
private static void divideBackMove() {
result = new int[n][m];
int row = n / 2;
int col = m / 2;
//1->4
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
result[row+i][j] = board[i][j];
}
}
//4->3
for(int i = row; i < n; i++) {
for(int j = 0; j < col; j++) {
result[i][j+col] = board[i][j];
}
}
//3->2
for(int i = 0; i < row; i++) {
for(int j = col; j < m; j++) {
result[i][j] = board[i+row][j];
}
}
//2->1
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
result[i][j] = board[i][j+col];
}
}
board = result;
}
private void solution() {
}
private static class Point implements Comparable<Point> {
private int x;
private int y;
private int crush;
public Point(int x, int y, int crush) {
this.x = x;
this.y = y;
this.crush = crush;
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
", crush=" + crush +
'}';
}
@Override
public int compareTo(Point o) {
return this.crush - o.crush;
}
}
}