[BOJ 16935] 배열 돌리기3

업데이트:

문제

  • BOJ 16935
  • 문제의 저작권은 Baekjoon Online Judge에 있습니다.

접근방식

구현하는 문제라 전체적으로 어렵지는 않았다. 주의할점으로는 3,4번에서 90도 회전시키면서 N과 M이 바뀌게 되는데 이 경우만 잘 처리해주면 된다.
5,6번은 배열돌리기1,2와 똑같은 방식으로 해결하였다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	static int N, M, R; //세로,가로
	static int[][] map, tmp;

	public static void main(String[] args) throws IOException {
		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());

		map = new int[N][M];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		} // End input

		st = new StringTokenizer(br.readLine());
		for (int r = 0; r < R; r++) {
			int order = Integer.parseInt(st.nextToken());
			simulation(order);
		}
		showMap();

	}

	private static void showMap() {
		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}
	}

	private static void simulation(int order) {
		int midN, midM;

		switch (order) {
		case 1: //상하 반전
			tmp = new int[N][M];
			for(int i=N-1; i>=0; i--) {
				for(int j=0; j<M; j++) {
					tmp[N-1-i][j] = map[i][j];
				}
			}
			break;
		case 2: //좌우 반전
			tmp = new int[N][M];
			for(int i=0; i<N; i++) {
				for(int j=0; j<M; j++) {
					tmp[i][M-1-j] = map[i][j];
				}
			}
			break;
		case 3: //오른쪽 90도회전
			tmp = new int[M][N];
			for(int j=0; j<M; j++) {
				for(int i=N-1; i>=0; i--) {
					tmp[j][N-1-i] = map[i][j];
				}
			}
			break;
		case 4: //왼쪽 90도 회전
			tmp = new int[M][N];
			for(int j=M-1; j>=0; j--) {
				for(int i=0; i<N; i++) {
					tmp[M-1-j][i] = map[i][j];
				}
			}
			break;
		case 5: //1번->2->3->4->1
			tmp = new int[N][M];
			midN = N/2;
			midM = M/2;

			//1->2
			for(int i=0; i<midN; i++) {
				for(int j=0; j<midM; j++) {
					tmp[i][j+midM] = map[i][j];
				}
			}

			//2->3
			for(int i=0; i<midN; i++) {
				for(int j=midM; j<M; j++) {
					tmp[i+midN][j] = map[i][j];
				}
			}

			//3->4
			for(int i=midN; i<N; i++) {
				for(int j=midM; j<M; j++) {
					tmp[i][j-midM] = map[i][j];
				}
			}

			//4->1
			for(int i=midN; i<N; i++) {
				for(int j=0; j<midM; j++) {
					tmp[i-midN][j] = map[i][j];
				}
			}
			break;
		case 6://1->4->3->2->1
			tmp = new int[N][M];
			midN = N/2;
			midM = M/2;

			//1->4
			for(int i=0; i<midN; i++) {
				for(int j=0; j<midM; j++) {
					tmp[i+midN][j] = map[i][j];
				}
			}

			//4->3
			for(int i=midN; i<N; i++) {
				for(int j=0; j<midM; j++) {
					tmp[i][j+midM] = map[i][j];
				}
			}

			//3->2
			for(int i=midN; i<N; i++) {
				for(int j=midM; j<M; j++) {
					tmp[i-midN][j] = map[i][j];
				}
			}

			//2->1
			for(int i=0; i<midN; i++) {
				for(int j=midM; j<M; j++) {
					tmp[i][j-midM] = map[i][j];
				}
			}
			break;
		default:
			break;
		}

		copyMap(tmp);
	}

	private static void copyMap(int[][] tmp) {
		N = tmp.length;
		M = tmp[0].length;

		map = tmp;
	}
}