뚱땅뚱땅

[문제] 백준 16935번 배열 돌리기 3 본문

알고리즘/백준

[문제] 백준 16935번 배열 돌리기 3

양순이 2021. 2. 11. 15:28
728x90

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

풀이

 

배열 돌리기 1과 4를 했다면 쉽게 풀 수 있다. 

여기서 오른쪽, 왼쪽 방향으로 회전할 때 행렬의 크기가 반대로 변경되니까 이점만 유의하면 된다.

public class BOJ_16935 {
	static int N;
	static int M;
	static int[][] matrix;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String s[] = in.readLine().split(" ");

		N = Integer.parseInt(s[0]);
		M = Integer.parseInt(s[1]);
		int R = Integer.parseInt(s[2]); // R: 연산 횟수

		// init matrix
		matrix = new int[N][M];

		for (int i = 0; i < N; i++) {
			String ss[] = in.readLine().split(" ");
			for (int j = 0; j < M; j++) {
				matrix[i][j] = Integer.parseInt(ss[j]);
			}
		}
		// init inst
		String sss[] = in.readLine().split(" ");
		for (int i = 0; i < R; i++) {
			int inst = Integer.parseInt(sss[i]);
			if (inst == 1) {
				one();
			} else if (inst == 2) {
				two();
			} else if (inst == 3) {
				three();
			} else if (inst == 4) {
				four();
			} else if (inst == 5) {
				five();
			} else if (inst == 6) {
				six();
			}
		}
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				System.out.print(matrix[i][j] + " ");
			}
			System.out.println();
		}
	}

	// 상하반전 (행열 변화 x)
	static void one() {
		int it = N / 2;
		for (int i = 0; i < it; i++) {
			for (int j = 0; j < M; j++) {
				int tmp = matrix[i][j];
				matrix[i][j] = matrix[N - 1 - i][j];
				matrix[N - 1 - i][j] = tmp;
			}
		}
	}

	// 좌우반전
	static void two() {
		int it = M / 2;
		for (int i = 0; i < it; i++) {
			for (int j = 0; j < N; j++) {
				int tmp = matrix[j][i];
				matrix[j][i] = matrix[j][M - 1 - i];
				matrix[j][M - 1 - i] = tmp;
			}
		}
	}

	// 오른쪽 90도 (행열 바뀜) n,m -> m,n
	static void three() {
		int[][] newMatrix = new int[M][N];

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				newMatrix[j][N - i - 1] = matrix[i][j];
			}
		}

		int tmp = N;
		N = M;
		M = tmp;
		matrix = new int[N][M];
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				matrix[i][j] = newMatrix[i][j];
			}
		}

	}

	// 왼쪽 90도
	static void four() {
		int[][] newMatrix = new int[M][N];

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				newMatrix[M-j-1][i] = matrix[i][j];
			}
		}

		int tmp = N;
		N = M;
		M = tmp;
		matrix = new int[N][M];
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				matrix[i][j] = newMatrix[i][j];
			}
		}
	}

	// 1-2-3-4-1
	static void five() {
		int hN = N/2;
		int hM = M/2;
		int[][] tmp1 = new int[hN][hM];
		for(int i=0;i<hN;i++) {
			for(int j=0;j<hM;j++) {
				tmp1[i][j] = matrix[i][j];
			}
		}
		// 4->1
		for(int i=N/2;i<N;i++) {
			for(int j=0;j<M/2;j++) {
				matrix[i-N/2][j]=matrix[i][j];
			}
		}
		// 3->4
		for(int i=hN;i<N;i++) {
			for(int j=hM;j<M;j++) {
				matrix[i][j-hM] = matrix[i][j];
			}
		}
		//2->3
		for(int i=0;i<hN;i++) {
			for(int j=hM;j<M;j++) {
				matrix[i+hN][j] = matrix[i][j];
			}
		}
		// tmp1 -> 2
		for(int i=0;i<hN;i++) {
			for(int j=hM;j<M;j++) {
				matrix[i][j] = tmp1[i][j-hM];
			}
		}
	}

//1-4, 4-3, 3-2.2-1
	static void six() {
		int hN = N/2;
		int hM = M/2;
		
		int[][] tmp1 = new int[hN][hM];
		for(int i=0;i<hN;i++) {
			for(int j=0;j<hM;j++) {
				tmp1[i][j] = matrix[i][j];
			}
		}
		//2->1
		for(int i=0;i<hN;i++) {
			for(int j=hM;j<M;j++) {
				matrix[i][j-hM] = matrix[i][j];
			}
		}
		//3-> 2
		for(int i=hN;i<N;i++) {
			for(int j=hM;j<M;j++) {
				matrix[i-hN][j] = matrix[i][j];
			}
		}
		//4->3
		for(int i=hN;i<N;i++) {
			for(int j=0;j<hM;j++) {
				matrix[i][j+hM] = matrix[i][j];
			}
		}
		//1->4
		for(int i=0;i<hN;i++) {
			for(int j=0;j<hM;j++) {
				matrix[i+hN][j] = tmp1[i][j];
			}
		}
	}
}
728x90
Comments