본문 바로가기

Algorithm/문제

[백준 / JAVA] 16935. 배열 돌리기 3 (G5)

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

 

얘는 순수 구현이 맞다... 팁이 하나 있다면 몇몇 기능은 이전에 만든 기능들의 조합으로 구현할 수 있다. 하지만 속도가 느려질 것 같은 느낌이 들어 나는 바꾸진 않았다.

 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.util.*;

class Main {
	static BufferedReader br;
	static BufferedWriter bw;
	static StringTokenizer st;
	static StringBuilder sb;

	public static void main(String[] args) throws Exception {
		br = new BufferedReader(new InputStreamReader(System.in));
		sb = new StringBuilder();
		st = new StringTokenizer(br.readLine());

		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		int calc = Integer.parseInt(st.nextToken());

		map = new int[R][C];

		for (int i = 0; i < R; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < C; j++)
				map[i][j] = Integer.parseInt(st.nextToken());
		}

		st=new StringTokenizer(br.readLine());
		for(int i=0;i<calc;i++) {
			switch(st.nextToken()) {
			case "1": one();break;
			case "2": two();break;
			case "3": three();break;
			case "4": four();break;
			case "5": five();break;
			case "6": six();
			}
		}

		for (int[] mp : map) {
			for (int v : mp)
				sb.append(v+" ");
			sb.append("\n");
		}
		System.out.println(sb);
	}

	static int R, C;
	static int[] map[];

	private static void one() { // 상하 반전
		for (int i = 0; i < R / 2; i++) {
			int tmp[] = Arrays.copyOf(map[i], C);
			map[i] = map[R - 1 - i];
			map[R - 1 - i] = tmp;
		}
	}

	private static void two() { // 좌우 반전
		int tmp;
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C / 2; j++) {
				tmp = map[i][j];
				map[i][j] = map[i][C - j - 1];
				map[i][C - j - 1] = tmp;
			}
		}
	}

	private static void three() { // 오른쪽 90도
		int[][] tmpArray = new int[R][C];
		for (int i = 0; i < R; i++)
			tmpArray[i] = Arrays.copyOf(map[i], C);
		map = new int[C][R];
		int tmp = R;
		R = C;
		C = tmp;
		for (int i = 0; i < R; i++)
			for (int j = 0; j < C; j++)
				map[i][j] = tmpArray[C - j - 1][i];
	}

	private static void four() { // 왼쪽 90도
		int[][] tmpArray = new int[R][C];
		for (int i = 0; i < R; i++)
			tmpArray[i] = Arrays.copyOf(map[i], C);
		map = new int[C][R];
		int tmp = R;
		R = C;
		C = tmp;
		for (int i = 0; i < R; i++)
			for (int j = 0; j < C; j++)
				map[i][j] = tmpArray[j][R - i - 1];
	}

	private static void five() {
		int[][] tmpArray = new int[R][C];
		for (int i = 0; i < R; i++)
			tmpArray[i] = Arrays.copyOf(map[i], C);
		for (int i = 0; i < R / 2; i++) { // 4사분면
			for (int j = 0; j < C / 2; j++)
				map[i][j] = tmpArray[i + R / 2][j];
		}
		for (int i = 0; i < R / 2; i++) { // 1사분면
			for (int j = C / 2; j < C; j++)
				map[i][j] = tmpArray[i][j - C / 2];
		}
		for (int i = R / 2; i < R; i++) { // 2사분면
			for (int j = C / 2; j < C; j++)
				map[i][j] = tmpArray[i - R / 2][j];
		}
		for (int i = R / 2; i < R; i++) { // 3사분면
			for (int j = 0; j < C / 2; j++)
				map[i][j] = tmpArray[i][j + C / 2];
		}
	}

	private static void six() {
		int[][] tmpArray = new int[R][C];
		for (int i = 0; i < R; i++)
			tmpArray[i] = Arrays.copyOf(map[i], C);
		for (int i = 0; i < R / 2; i++) { // 4사분면
			for (int j = 0; j < C / 2; j++)
				map[i][j] = tmpArray[i][j + C / 2];
		}
		for (int i = 0; i < R / 2; i++) { // 1사분면
			for (int j = C / 2; j < C; j++)
				map[i][j] = tmpArray[i + R / 2][j];
		}
		for (int i = R / 2; i < R; i++) { // 2사분면
			for (int j = C / 2; j < C; j++)
				map[i][j] = tmpArray[i][j - C / 2];
		}
		for (int i = R / 2; i < R; i++) { // 3사분면
			for (int j = 0; j < C / 2; j++)
				map[i][j] = tmpArray[i - R / 2][j];
		}
	}
}