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

Yoon Uk·2022년 8월 7일
0

알고리즘 - 백준

목록 보기
49/130
post-thumbnail
post-custom-banner

문제

BOJ 16935: 배열 돌리기 3 https://www.acmicpc.net/problem/16935

풀이

조건

  • 3번, 4번 연산은 세로 길이와 가로 길이가 바뀔 수 있다.

풀이 순서

  1. 상하 반전할 땐 세로 길이의 절반을 기준으로 잡고 반전시킨다.
  2. 좌우 반전할 땐 가로 길이의 절반을 기준으로 잡고 반전시킨다.
  3. 오른쪽으로 90도 회전 (시계 방향)
    • Queue에 모든 값을 차례로 넣는다.
    • 가로/세로 길이가 변환될 수 있으므로 처리를 해준다.
    • 가로/세로 길이가 변환된 새로운 배열(copy)를 만든다.
    • Queue에 있는 값을 copy 배열에 차례로 해당 위치에 뽑아서 넣어 준다.
    • arr 배열의 가로/세로 길이를 새로 정의해주고 copy 배열의 값을 복사해 준다.
  4. 왼쪽으로 90도 회전 (반시계 방향)
    • Queue에 모든 값을 차례로 넣는다.
    • 가로/세로 길이가 변환될 수 있으므로 처리를 해준다.
    • 가로/세로 길이가 변환된 새로운 배열(copy)를 만든다.
    • Queue에 있는 값을 copy 배열에 차례로 해당 위치에 뽑아서 넣어 준다.
    • arr 배열의 가로/세로 길이를 새로 정의해주고 copy 배열의 값을 복사해 준다.
  5. 4등분 한 덩어리를 시계방향으로 회전
    • 복사할 배열(copy)를 만든다.
    • 가로/세로 길이의 절반인 값을 새로운 변수에 넣어 준다.
    • 차례로 copy 배열에 회전시킨 값을 넣어준다.
    • arr 배열copy 배열의 값을 복사해 준다.
  6. 4등분 한 덩어리를 반시계방향으로 회전
    • 복사할 배열(copy)를 만든다.
    • 가로/세로 길이의 절반인 값을 새로운 변수에 넣어 준다.
    • 차례로 copy 배열에 회전시킨 값을 넣어준다.
    • arr 배열copy 배열의 값을 복사해 준다.

코드

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

public class Main {
    
	static int N, M, R;
	static int[][] arr;
    
    public static void main(String[] args) throws IOException {
    	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 i=0; i<N; i++) {
    		st = new StringTokenizer(br.readLine(), " ");
    		for(int j=0; j<M; j++) {
    			arr[i][j] = Integer.parseInt(st.nextToken());
    		}
    	}
    	
    	st = new StringTokenizer(br.readLine(), " ");
    	for(int i=0; i<R; i++) {
    		int o = Integer.parseInt(st.nextToken());
    		
    		rotate(o);
    	}
    	
    	print();
    }


    static void rotate(int order) {
    	switch(order) {
	    	case 1: rotateOne();
	    		break;
	    	case 2: rotateTwo();
	    		break;
	    	case 3: rotateThree();
	    		break;
	    	case 4: rotateFour();
	    		break;
	    	case 5: rotateFive();
	    		break;
	    	case 6: rotateSix();
	    		break;
    	}
    }
    
    // 상하 반전
    static void rotateOne() {
    	for(int j=0; j<M; j++) {
    		for(int i=0; i<N/2; i++) {
    			int temp = arr[i][j];
    			arr[i][j] = arr[N-i-1][j];
    			arr[N-i-1][j] = temp;
    		}
    	}
    }
    
    // 좌우 반전
    static void rotateTwo() {
    	for(int i=0; i<N; i++) {
			for(int j=0; j<M/2; j++) {
				int temp = arr[i][j];
				arr[i][j] = arr[i][M-j-1];
				arr[i][M-j-1] = temp;
			}
		}
    }
    
    // 오른쪽으로 90도 회전 (시계 방향)
    static void rotateThree() {
    	Queue<Integer> que = new LinkedList<>();
    	
    	// 가로/세로 길이 변환 시 사용
    	int newILen = M;
    	int newJLen = N;
    	
    	int[][] copy = new int[newILen][newJLen];
    	
    	for(int i=0; i<N; i++) {
    		for(int j=0; j<M; j++) {
    			que.add(arr[i][j]);
    		}
    	}
    	
    	for(int j=N-1; j>=0; j--) {
    		for(int i=0; i<M; i++) {
    			copy[i][j] = que.poll();
    		}
    	}
    	
    	// 가로/세로 변환된 arr을 새로 정의
    	N = newILen;
    	M = newJLen;
    	
    	arr = new int[N][M];
    	for(int i=0; i<N; i++) {
    		for(int j=0; j<M; j++) {
    			arr[i][j] = copy[i][j];
    		}
    	}
    }
    
    // 왼쪽으로 90도 회전 (반시계 방향)
    static void rotateFour() {
    	Queue<Integer> que = new LinkedList<>();
    	
    	// 가로/세로 길이 변환 시 사용
    	int newILen = M;
    	int newJLen = N;
    	
    	int[][] copy = new int[newILen][newJLen];
    	
    	for(int i=0; i<N; i++) {
    		for(int j=0; j<M; j++) {
    			que.add(arr[i][j]);
    		}
    	}
    	
    	for(int j=0; j<N; j++) {
    		for(int i=M-1; i>=0; i--) {
    			copy[i][j] = que.poll();
    		}
    	}
    	
    	
    	// 가로/세로 변환된 arr을 새로 정의
    	N = newILen;
    	M = newJLen;
    	
    	arr = new int[N][M];
    	for(int i=0; i<N; i++) {
    		for(int j=0; j<M; j++) {
    			arr[i][j] = copy[i][j];
    		}
    	}
    	
    }
    
    // 덩어리를 시계방향으로
    static void rotateFive() {
    	int[][] copy = new int[N][M];
		int n = N/2;
		int m = M/2;
		
		for(int i = 0; i<n; i++) {
			for(int j=0; j<m; j++) {
				copy[i][j+m] = arr[i][j];
			}
		}
		for(int i = 0; i<n; i++) {
			for(int j=0; j<m; j++) {
				copy[i+n][j+m] = arr[i][j+m];
			}
		}
		for(int i = 0; i<n; i++) {
			for(int j=0; j<m; j++) {
				copy[i+n][j] = arr[i+n][j+m];
			}
		}
		for(int i = 0; i<n; i++) {
			for(int j=0; j<m; j++) {
				copy[i][j] = arr[i+n][j];
			}
		}
		
		// 원본에 복사
		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				arr[i][j] = copy[i][j];
			}
		}
    }
    
    // 덩어리를 반시계방향으로
    static void rotateSix() {
    	int[][] copy = new int[N][M];
		int n = N/2;
		int m = M/2;
    	
		for(int i = 0; i<n; i++) {
			for(int j=0; j<m; j++) {
				copy[i+n][j+m] = arr[i+n][j];
			}
		}
		for(int i = 0; i<n; i++) {
			for(int j=0; j<m; j++) {
				copy[i][j+m] = arr[i+n][j+m];
			}
		}
		for(int i = 0; i<n; i++) {
			for(int j=0; j<m; j++) {
				copy[i+n][j] = arr[i][j];
			}
		}
		for(int i = 0; i<n; i++) {
			for(int j=0; j<m; j++) {
				copy[i][j] = arr[i][j+m];
			}
		}
    	
		// 원본에 복사
    	for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				arr[i][j] = copy[i][j];
			}
		}
    }
    
    // 출력 함수
    static void print() {
    	for(int i=0; i<N; i++) {
    		for(int j=0; j<M; j++) {
    			System.out.print(arr[i][j]+" ");
    		}
    		System.out.println();
    	}
    }
}

정리

  • 구현할 부분이 많아서 시간이 오래 걸렸다.
  • 회전 시킬 때 Queue를 사용 하는 방법을 알았다.
post-custom-banner

0개의 댓글