티스토리 뷰

16935. 배열 돌리기 3

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

 

배열의 크기가 바뀌는 경우가 있다.

가로 N, 세로 M인 배열로 rotate3, roate4를 수행하고 나면 크기가 가로 M, 세로 N으로 뒤집히게 된다.

따라서 배열의 길이를 가로 N, 세로 M이라고 고정시켜 놓고 여러 연산을 연달아 수행하는 경우 에러가 발생하게 된다.

각 연산마다 가로, 세로 길이를 구해놓고 연산을 시작하도록 하였다.

 

import java.io.*;
import java.util.*;

// 210210

public class Main_BJ_16935_배열돌리기3 {
	
	static int N, M, R, O;
	static int[][] arr;
	static int[][] newArr;
	
	static void printArr() {
		for(int r=0; r<arr.length; r++) {
			for (int c=0; c<arr[r].length; c++) {
				System.out.print(arr[r][c] + " ");
			}
			System.out.println();
		}
	} //
	
	static void copyArr(int NN, int NM) {
		// arr에 newArr copy
		arr = new int[NN][NM];
		for(int r=0; r<NN; r++) {
			for (int c=0; c<NM; c++) {
				arr[r][c] = newArr[r][c];
			}
		}
	} // 
	
	static void rotate1() {
		int NN = arr.length;
		int NM = arr[0].length;
		
		for(int r=0; r<NN/2; r++) {
			for (int c=0; c<NM; c++) {
				int tmp = arr[r][c];
				arr[r][c] = arr[NN-1-r][c];
				arr[NN-1-r][c] = tmp;
			}
		}
	} //
	
	static void rotate2() {
		int NN = arr.length;
		int NM = arr[0].length;
		
		for(int r=0; r<NN; r++) {
			for (int c=0; c<NM/2; c++) {
				int tmp = arr[r][c];
				arr[r][c] = arr[r][NM-1-c];
				arr[r][NM-1-c] = tmp;
			}
		}
	} //
	
	static void rotate3() {
		int NN = arr.length;
		int NM = arr[0].length;
		
		newArr = new int[NM][NN];
		
		for(int r=0; r<NN; r++) {
			for (int c=0; c<NM; c++) {
				newArr[c][NN-1-r] = arr[r][c];
			}
		}
		
		copyArr(NM, NN);
	} //
	
	static void rotate4() {
		int NN = arr.length;
		int NM = arr[0].length;
		
		newArr = new int[NM][NN];
		
		for(int r=0; r<NN; r++) {
			for (int c=0; c<NM ; c++) {
				newArr[NM-1-c][r] = arr[r][c];
			}
		}
		
		copyArr(NM, NN);

	} //
	
	static void rotate5() {
		int NN = arr.length;
		int NM = arr[0].length;
		
		newArr = new int[NN][NM];
	
		for(int r = 0; r<NN/2; r++) {
			// 1번구역
			for(int c=0; c<NM/2; c++) {
				newArr[r][c+NM/2] = arr[r][c];
			}
			// 2번 구역
			for(int c=NM/2; c<NM; c++) {
				newArr[r+NN/2][c] = arr[r][c];
			}
		} 
				
		for(int r = NN/2; r<NN; r++) {
			// 4번구역
			for(int c=0; c<NM/2; c++) {
				newArr[r-NN/2][c] = arr[r][c];
			}
			// 3번 구역
			for(int c=NM/2; c<NM; c++) {
				newArr[r][c-NM/2] = arr[r][c];
			}
		} 
		
		copyArr(NN, NM);
		
	} //
	
	static void rotate6() {
		int NN = arr.length;
		int NM = arr[0].length;
		
		newArr = new int[NN][NM];
	
		for(int r = 0; r<NN/2; r++) {
			// 1번구역 -> 4
			for(int c=0; c<NM/2; c++) {
				newArr[r+NN/2][c] = arr[r][c];
			}
			// 2번 구역 -> 1
			for(int c=NM/2; c<NM; c++) {
				newArr[r][c-NM/2] = arr[r][c];
			}
		} 
				
		for(int r = NN/2; r<NN; r++) {
			// 4번구역 -> 3
			for(int c=0; c<NM/2; c++) {
				newArr[r][c+NM/2] = arr[r][c];
			}
			// 3번 구역 -> 2
			for(int c=NM/2; c<NM; c++) {
				newArr[r-NN/2][c] = arr[r][c];
			}
		} 
		
		copyArr(NN, NM);
		
	} //

	
	public static void main(String[] args) throws Exception {
		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()); // 연산 수
		
		arr = new int[N][M];
		
		for(int r=0; r<N; r++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int c=0; c<M; c++) {
				arr[r][c] = Integer.parseInt(st.nextToken());
			}
		}
		
		st = new StringTokenizer(br.readLine(), " ");
		for(int ri=0; ri<R; ri++) {
			O = Integer.parseInt(st.nextToken()); // 연산 종류
			switch (O) {
			case 1: rotate1(); break;
			case 2: rotate2(); break;
			case 3: rotate3(); break;
			case 4: rotate4(); break;
			case 5: rotate5(); break;
			case 6: rotate6(); break;
			}
		}
		
		printArr();

		br.close();
	}

}

 

 

'코딩테스트 > 백준' 카테고리의 다른 글

[BJ] 10870. 피보나치 수 5  (0) 2021.02.14
[BJ] 10872. 팩토리얼  (0) 2021.02.14
[BJ] 16926. 배열 돌리기1  (0) 2021.02.11
[BJ] 2577. 숫자의 개수  (0) 2021.02.09
[BJ] 2563. 색종이  (0) 2021.02.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함