hye-log

[백준]16935 배열 돌리기3(JAVA) 본문

CodingTest/Baekjoon

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

iihye_ 2023. 8. 10. 02:11

0. 문제 링크

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

 

1. 문제 설명

1) N*M 배열에 6가지 연산을 R번 적용하기

 

2. 입출력

// input
6 8 1 // N, M, R
3 2 6 3 1 2 9 7 // 배열
9 7 8 2 1 4 5 3
5 9 2 1 9 6 1 8
2 1 3 8 6 3 9 2
1 3 2 8 7 9 2 1
4 5 1 9 8 2 1 3
1 // 연산

// output
4 5 1 9 8 2 1 3
1 3 2 8 7 9 2 1
2 1 3 8 6 3 9 2
5 9 2 1 9 6 1 8
9 7 8 2 1 4 5 3
3 2 6 3 1 2 9 7

 

3. 코드

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

public class b16935 {
	public static void main(String[] args) throws IOException, NumberFormatException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		int R = Integer.parseInt(st.nextToken()); // 연산 횟수
		int[][] map = new int[N][M];
		int[][] ans = new int[N][M];
		int[][] ansR = new int[M][N];
		
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		st = new StringTokenizer(br.readLine());
		int K, n, m;
		for (int r = 0; r < R; r++) {
			K = Integer.parseInt(st.nextToken()); // 수행해야 하는 연산
			
			switch(K) {
			case 1: // 상하 반전
				n = map.length;
				m = map[0].length;
				ans = new int[n][m];
				for (int i = 0; i < n; i++) {
					for (int j = 0; j < m; j++) {
						ans[i][j] = map[n-i-1][j];
					}
				}
				map = ans;
				break;
				
			case 2: // 좌우 반전
				n = map.length;
				m = map[0].length;
				ans = new int[n][m];
				for (int i = 0; i < n; i++) {
					for (int j = 0; j < m ; j++) {
						ans[i][j] = map[i][m-j-1];
					}
				}
				map = ans;
				break;
				
			case 3: // 오른쪽으로 90도 회전
				ansR = new int[map[0].length][map.length];
				n = ansR.length;
				m = ansR[0].length;
				for (int i = 0; i < n; i++) {
					for (int j = 0; j < m; j++) {
						ansR[i][j] = map[m-j-1][i];
					}
				}
				map = ansR;
				break;
				
			case 4: // 왼쪽으로 90도 회전
				ansR = new int[map[0].length][map.length];
				n = ansR.length;
				m = ansR[0].length;
				for (int i = 0; i < n; i++) {
					for (int j = 0; j < m; j++) {
						ansR[i][j] = map[j][n-i-1];
					}
				}
				map = ansR;	
				break;
				
			case 5: // 부분 배열로 나누어 오른쪽으로
				n = map.length;
				m = map[0].length;
				ans = new int[n][m];
				for (int i = 0; i < n; i++) {
					if(i < n/2) {
						for (int j = 0; j < m; j++) {
							if(j < m/2) ans[i][j] = map[i+n/2][j];
							else ans[i][j] = map[i][j-m/2];
						}
					}	else {
						for (int j = 0; j < m; j++) {
							if(j < m/2) ans[i][j] = map[i][j+m/2];
							else ans[i][j] = map[i-n/2][j];
						}
					}
				}
				map = ans;
				break;
				
			case 6: // 부분 배열을 나누어 왼쪽으로
				n = map.length;
				m = map[0].length;
				ans = new int[n][m];
				for (int i = 0; i < n; i++) {
					if(i < n/2) {
						for (int j = 0; j < m; j++) {
							if(j < m/2) ans[i][j] = map[i][j+m/2];
							else ans[i][j] = map[i+n/2][j];
						}
					}	else {
						for (int j = 0; j < m; j++) {
							if(j < m/2) ans[i][j] = map[i-n/2][j];
							else ans[i][j] = map[i][j-m/2];
						}
					}
				}
				map = ans;
				break;
			}
			
			print(map);
		}
	}

	private static void print(int[][] arr) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[0].length; j++) {
				sb.append(arr[i][j] + " ");
			}
			sb.append("\n");
		}
		System.out.println(sb.toString());
	}
}

 

실행 결과

 

4. 회고

1) 정사각형 배열이 아닌 N*M 직사각형 배열이고, 90도 회전을 통해 배열의 크기가 M*N으로 바뀔 수 있는 점을 고려하기

2) 코드의 반복을 줄이고자 for 문, if 문으로 인덱스의 값을 계산하여 구현

 

5. Github

https://github.com/iihye/Algorithm/blob/main/Baekjoon/b16935.java

 

728x90
Comments