Dino Rudy

[백준] 배열 돌리기 3_16935번 - 공룡 루디 본문

Algorithm/Baekjoon

[백준] 배열 돌리기 3_16935번 - 공룡 루디

Dino_Rudy 2021. 8. 14. 14:15

 배열 돌리기 3 16935번 solved.ac 실버 2

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

 문제 해석 및 풀이

 

배열 돌리기 3 문제는

크기가 N x M 2차원 배열에 6가지 연산을 구현해야 합니다.

 

1. 상하반전

2. 좌우반전

3. 오른쪽으로 90도 회전

4. 왼쪽으로 90도 회전

5. 4등분 후 시계방향으로 위치 조정

6. 4등분 후 반시계 방향으로 위치 조정

 

총 6가지 연산을 구현해야 합니다.

 

이 문제에서 주의해야 할 점은

3,4번 연산을 수행할 때 행과 열의 크기가 바뀐다는 점을 주의하셔야 합니다.

 

따라서 2차원 배열을 선언할 때 n과 m 중 큰 수를 big이라고 했을 때

int [][] arr = new int [big][big]과 같이 선언해줘야 하고

3,4번 연산을 수행할 때마다 n과 m을 바꿔줘야 합니다.

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	public static int n, m, r, big;
	public static int[][] arr;
	public static int[][] tmp;
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

	public static void copy(int[][] tmp) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				arr[i][j] = tmp[i][j];
			}
		}
	}

	public static void print(int[][] tmp) throws IOException {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				bw.write((tmp[i][j] + " "));
			}
			bw.write("\n");
		}
	}

	public static void do1() { //상하반전

		for (int i = 0; i < n / 2; i++) {
			for (int j = 0; j < m; j++) {
				tmp[i][j] = arr[n - 1 - i][j];
				tmp[n - 1 - i][j] = arr[i][j];
			}
		}
		copy(tmp);
	}

	public static void do2() { //좌우반전

		for (int c = 0; c < m / 2; c++) {
			for (int r = 0; r < n; r++) {
				tmp[r][c] = arr[r][m - 1 - c];
				tmp[r][m - 1 - c] = arr[r][c];
			}
		}

		copy(tmp);
	}

	public static void do3() { //오른쪽으로 90도 회전
		int tmp_n = n;
		n = m;
		m = tmp_n;
		for (int r = 0; r < m; r++) {
			for (int c = 0; c < n; c++) {
				tmp[c][m - 1 - r] = arr[r][c];
			}
		}

		copy(tmp);
	}

	public static void do4() { //왼쪽으로 90도 회전
		int tmp_n = n;
		n = m;
		m = tmp_n;

		for (int r = 0; r < m; r++) {
			for (int c = 0; c < n; c++) {
				tmp[n - 1 - c][r] = arr[r][c];
			}
		}
		copy(tmp);
	}

	public static void do5() { //4등분 후 시계방향

		for (int r = 0; r < n / 2; r++) {
			for (int c = 0; c < m / 2; c++) {
				tmp[r][m / 2 + c] = arr[r][c];
			}
		}

		for (int r = 0; r < n / 2; r++) {
			for (int c = m / 2; c < m; c++) {
				tmp[n / 2 + r][c] = arr[r][c];
			}
		}

		for (int r = n / 2; r < n; r++) {
			for (int c = m / 2; c < m; c++) {
				tmp[r][c - m / 2] = arr[r][c];
			}
		}

		for (int r = n / 2; r < n; r++) {
			for (int c = 0; c < m / 2; c++) {
				tmp[r - n / 2][c] = arr[r][c];
			}
		}

		copy(tmp);
	}

	public static void do6() { //4등분 후 반시계 방향
		for (int r = 0; r < n / 2; r++) {
			for (int c = 0; c < m / 2; c++) {
				tmp[r + n / 2][c] = arr[r][c];
			}
		}

		for (int r = 0; r < n / 2; r++) {
			for (int c = m / 2; c < m; c++) {
				tmp[r][c - m / 2] = arr[r][c];
			}
		}

		for (int r = n / 2; r < n; r++) {
			for (int c = m / 2; c < m; c++) {
				tmp[r - n / 2][c] = arr[r][c];
			}
		}

		for (int r = n / 2; r < n; r++) {
			for (int c = 0; c < m / 2; c++) {
				tmp[r][c + m / 2] = arr[r][c];
			}
		}

		copy(tmp);
	}

	public static void main(String[] args) throws IOException {

		String[] inp = br.readLine().split(" ");
		n = Integer.parseInt(inp[0]);
		m = Integer.parseInt(inp[1]);
		r = Integer.parseInt(inp[2]);

		big = n > m ? n : m;
		arr = new int[big][big];
		tmp = new int[big][big];

		for (int i = 0; i < n; i++) {
			inp = br.readLine().split(" ");
			for (int j = 0; j < m; j++)
				arr[i][j] = Integer.parseInt(inp[j]);
		}

		inp = br.readLine().split(" ");

		for (int i = 0; i < inp.length; i++) {
			if (Integer.parseInt(inp[i]) == 1)
				do1();
			else if (Integer.parseInt(inp[i]) == 2)
				do2();
			else if (Integer.parseInt(inp[i]) == 3)
				do3();
			else if (Integer.parseInt(inp[i]) == 4)
				do4();
			else if (Integer.parseInt(inp[i]) == 5)
				do5();
			else if (Integer.parseInt(inp[i]) == 6)
				do6();
		}
		print(arr);
		br.close();
		bw.close();

	}
}