코딩문제풀이/Baekjoon

[Java] 백준 16935 : 배열 돌리기 3

코딩하는 포메라니안 2022. 2. 11. 17:56

1. 문제

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

 

16935번: 배열 돌리기 3

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 →

www.acmicpc.net

 

 

 

2. 풀이 과정

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	static String map[][];
	static int N, M;
	public static void oper1() {//1. 상하 반전 
		for(int i=0;i<N/2;i++) {
			String[] s = Arrays.copyOf(map[i], M);
			map[i] = map[N-1-i];
			map[N-1-i] = s;
		}
	}
	public static void oper2() {//2. 좌우 반전
		for(int i=0;i<M/2;i++) {
			for(int j=0;j<N;j++) {
				String temp = map[j][i];
				map[j][i] = map[j][M-1-i];
				map[j][M-1-i] = temp;
			}
		}
	}
	public static void oper3() {//3. => 90도 회전
		String[][] s = new String[M][N];
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				s[j][N-1-i] = map[i][j];
			}
		}
		map = s;
		int temp = N;
		N = M;
		M = temp;
	}
	public static void oper4() {//4. <= 90도 회전
		String[][] s = new String[M][N];
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				s[M-1-j][i] = map[i][j];
			}
		}
		map = s;
		int temp = N;
		N = M;
		M = temp;
	}
	public static void oper5() {//5. 4개의 그룹 - 시계방향 회전
		//N, M은 짝수
		//1 2
		//4 3
		String temp;
		for(int i=0;i<N/2;i++) {
			for(int j=0;j<M/2;j++) {
				temp = map[i][j];
				map[i][j] = map[N/2+i][j];
				map[N/2+i][j] = map[N/2+i][M/2+j];
				map[N/2+i][M/2+j] = map[i][M/2+j];
				map[i][M/2+j] = temp;
			}
		}
	}
	public static void oper6() {//6. 4그룹 - 반시계방향 회전
		//1 2
		//4 3
		String temp;
		for(int i=0;i<N/2;i++) {
			for(int j=0;j<M/2;j++) {
				temp = map[i][j];
				map[i][j] = map[i][M/2+j];
				map[i][M/2+j] = map[N/2+i][M/2+j];
				map[N/2+i][M/2+j] = map[N/2+i][j];
				map[N/2+i][j] = temp;
			}
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		M = sc.nextInt();
		int R = sc.nextInt();
		
		map= new String[N][M];
		sc.nextLine();
		//입력
		for(int i=0;i<N;i++) {
			map[i] = sc.nextLine().split(" ");
		}
		//연산
		for(int i=0;i<R;i++) {
			switch(sc.nextInt()) {
			case 1:
				oper1();
				break;
			case 2:
				oper2();
				break;
			case 3:
				oper3();
				break;
			case 4:
				oper4();
				break;
			case 5:
				oper5();
				break;
			case 6:
				oper6();
				break;
			}
		}
		//출력
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}
	}
}