백준 - 16935 : 배열 돌리기3 [자바]

HungAh.log·2021년 8월 12일
0
post-custom-banner
import java.io.*;
import java.util.*;

public class Main {
	static StringBuilder sb = new StringBuilder();
	static int[][] rotation;
	public static void main(String[] args) throws NumberFormatException, IOException  {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// N*M배열, 연산 R번 수행
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		int R = Integer.parseInt(st.nextToken());

		rotation = new int[N][M];

		// 배열 넣기
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < M; j++) {
				rotation[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		//연산 구분 1 5 4 8  
		st = new StringTokenizer(br.readLine(), " ");
		// R번만큼 반복
		while(st.hasMoreTokens()) {
			int tc = Integer.parseInt(st.nextToken());
			N = rotation.length;
			M = rotation[0].length;
			switch (tc) {
				case 1: {
					// 1 : 상하반전
					for (int i = 0; i < N / 2 + N % 2; i++) {
						for (int j = 0; j < M; j++) {
							int temp = rotation[i][j];
							rotation[i][j] = rotation[N - i - 1][j];
							rotation[N - i - 1][j] = temp;
						}
					}
					
					//System.out.println(printArray(rotation));
					break;
				}
				case 2: {
					// 2 : 좌우반전
					for (int i = 0; i < N; i++) {
						for (int j = 0; j < M / 2 + M % 2; j++) {
							int temp = rotation[i][j];
							rotation[i][j] = rotation[i][M - 1 - j];
							rotation[i][M - 1 - j] = temp;
						}
					}
					//System.out.println(printArray(rotation));
					break;
				}
				case 3: {
					// 3 : 오른쪽 90도 회전
					// 구십도 회전하니까 행, 열 개수가 바뀜
					int[][] array_R90 = new int[M][N];
					for (int i = 0; i < N; i++) {
						for (int j = 0; j < M; j++) {
							int temp = rotation[i][j]; // 현재 원소
							// 현재 열 -> 행, (N-현재 행 - 1)이 열이 됨
							array_R90[j][N - i - 1] = temp;
						}
					}
					rotation = new int[M][N];
					rotation = array_R90;
					//System.out.println(printArray(array_R90));
					break;
				}
				case 4: {
					// 4 : 왼쪽 90도 회전
					// 구십도 회전하니까 행, 열 개수가 바뀜
					int[][] array_L90 = new int[M][N];
					for (int i = 0; i < N; i++) {
						for (int j = 0; j < M; j++) {
							int temp = rotation[i][j]; // 현재 원소
							// 현재 행 -> 열, (M-현재 열 - 1)이 행이 됨
							array_L90[M - j - 1][i] = temp;
						}
					}
					rotation = new int[M][N];
					rotation = array_L90;
					//System.out.println(printArray(array_L90));
					break;
				}
	
				// case5, 6번은 짝수로 되는 듯
				case 5: {
					// 5 : 사분할 후 시계방향 1회 회전
					int[][] array_R4 = new int[N][M];
					//1->2 : 행 그대로, 열 이동
					for (int i = 0; i < N / 2; i++) {
						for (int j = 0; j < M / 2; j++) {
							array_R4[i][M/2+j] = rotation[i][j];
						}
					}
					
					//2->3 : 행 이동, 열 그대로
					for (int i = 0; i < N / 2; i++) {
						for (int j = M/2; j < M; j++) {
							array_R4[N/2+i][j] = rotation[i][j];
						}
					}
					
					//3->4 : 행 그대로, 열 이동
					for (int i = N/2; i < N; i++) {
						for (int j = M/2; j < M; j++) {
							array_R4[i][j-M/2] = rotation[i][j];
						}
					}
					
					//4->1 : 행 이동, 열 그대로
					for (int i = N/2; i < N; i++) {
						for (int j = 0; j < M / 2; j++) {
							array_R4[i-N/2][j] = rotation[i][j];
						}
					}
					rotation = new int[N][M];
					rotation = array_R4;
					//System.out.println(printArray(array_R4));
					break;
				}
				case 6: {
					// 6 : 사분할 후 반시계방향 1회 회전
					int[][] array_L4 = new int[N][M];
					//1->4 : 행 이동, 열 그대로
					for (int i = 0; i < N / 2; i++) {
						for (int j = 0; j < M / 2; j++) {
							array_L4[i+N/2][j] = rotation[i][j];
						}
					}
					
					//2->1 : 행 그대로, 열 이동 
					for (int i = 0; i < N / 2; i++) {
						for (int j = M/2; j < M; j++) {
							array_L4[i][j-M/2] = rotation[i][j];
						}
					}
					
					//3->2 : 행 이동, 열 그대로
					for (int i = N/2; i < N; i++) {
						for (int j = M/2; j < M; j++) {
							array_L4[i-N/2][j] = rotation[i][j];
						}
					}
					
					//4->3 : 행 그대로, 열 이동 
					for (int i = N/2; i < N; i++) {
						for (int j = 0; j < M / 2; j++) {
							array_L4[i][j+M/2] = rotation[i][j];
						}
					}
					rotation = new int[N][M];
					rotation = array_L4;
					//System.out.println(printArray(array_L4));
					break;
				}
			}
		}
		System.out.println(printArray(rotation));
	}
	static String printArray(int[][] a) {
		sb.setLength(0);
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[i].length; j++) {
				sb.append(a[i][j]).append(" ");
			}
			sb.append("\n");
		}
		sb.setLength(sb.length()-1);
		return sb.toString();
	}
}
profile
👩🏻‍💻
post-custom-banner

0개의 댓글