[BOJ 16935] 배열 돌리기3 (Java)

nnm·2020년 6월 2일
0

BOJ 16935 배열 돌리기3

문제풀이

배열 인덱스의 연산을 통해서 배열을 자유자재로 다룰 수 있는 구현은 여기저기서 많이 등장하는 중요한 요소다. 차근차근 직접 인덱스를 써보면 금방 규칙을 찾을 수 있다.

  • 반전시키기 (상하, 좌우)
    • 상하 반전의 경우에는 바깥 반복문에 열 인자를, 안쪽에서는 두 개의 행 인자를 두고서 두 개의 행 인자가 양끝에서 부터 좁혀오면서 배열 요소를 교환하고 두 인자가 반전될 때 그만하면된다. 좌우 반전은 반대로 수행하면 된다.
  • 90도 회전시키기
    • 새로운 배열[c][행 크기 - 1 - r] = 기존 배열[r][c]
    • 행, 열의 크기가 같을 때만 가능한줄 알았으나 직접 수행해본 결과 다음을 주의해서 적용하면 똑같이 가능하다.
      • 행, 열의 크기가 다른 경우 새로운 배열은 기존 배열의 행, 열의 크기가 바뀐다.
      • 반복문은 기존 배열의 행, 열의 크기를 기준으로 한다.
      • 새로운 배열[c][기존 배열 행 크기 - 1 - r] = 기존 배열[r][c]
    • 왼쪽으로 돌리려면 새로운 배열[r][c] = 기존 배열[c][기존 배열 행 길이 - 1 - r]
  • 4분할 회전
    • 1 -> 2 열 += 열 크기 / 2
    • 2 -> 3 행 += 행 크기 / 2
    • 3 -> 4 열 -= 열 크기 / 2
    • 4 -> 1 행 -= 행 크기 / 2
    • 반대 회전은 반대로 수행

구현코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {

	static int[][] map;
	static int N, M, R;
	
	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());
		
		map = new int[N][M];
		
		for(int r = 0 ; r < N ; ++r) {
			st = new StringTokenizer(br.readLine());
			for(int c = 0 ; c < M ; ++c) {
				map[r][c] = Integer.parseInt(st.nextToken());
			}
		}
		
		st = new StringTokenizer(br.readLine());
		for(int i = 0 ; i < R ; ++i) {
			int cmd = Integer.parseInt(st.nextToken());
			
			switch(cmd) {
			case 1:
				one();
				break;
			case 2:
				two();
				break;
			case 3:
				three();
				break;
			case 4:
				four();
				break;
			case 5:
				five();
				break;
			case 6:
				six();
				break;
			}
		}
		
		print();
	}
	
	private static void one() {
		for(int c = 0 ; c < map[0].length ; ++c) {
			for(int r1 = 0, r2 = map.length - 1 ; r1 < r2 ; r1++, r2--) {
				int temp = map[r1][c];
				map[r1][c] = map[r2][c];
				map[r2][c] = temp;
			}
		}
	}
	
	private static void two() {
		for(int r = 0 ; r < map.length ; ++r) {
			for(int c1 = 0, c2 = map[0].length - 1 ; c1 < c2 ; c1++, c2--) {
				int temp = map[r][c1];
				map[r][c1] = map[r][c2];
				map[r][c2] = temp;
			}
		}
	}
	
	private static void three() {
		int[][] result = new int[map[0].length][map.length];
		
		for(int r = 0 ; r < map.length ; ++r) {
			for(int c = 0 ; c < map[0].length ; ++c) {
				result[c][map.length - 1 - r] = map[r][c];
			}
		}
		
		map = result;
	}
	
	private static void four() {
		int[][] result = new int[map[0].length][map.length];
		
		for(int r = 0 ; r < result.length ; ++r) {
			for(int c = 0 ; c < result[0].length ; ++c) {
				result[r][c] = map[c][result.length - 1 - r];
			}
		}
		
		map = result;
	}
	
	private static void five() {
		int[][] result = new int[map.length][map[0].length];
		
		int rowSize = map.length;
		int colSize = map[0].length;
		
		// 1번 -> 2번 
		for(int r = 0 ; r < rowSize / 2 ; ++r) {
			for(int c = 0 ; c < colSize / 2 ; ++c) {
				result[r][c + colSize / 2] = map[r][c];
			}
		}
		
		// 2번 -> 3번
		for(int r = 0 ; r < rowSize / 2 ; ++r) {
			for(int c = colSize / 2 ; c < colSize ; ++c) {
				result[r + rowSize / 2][c] = map[r][c];
			}
		}
		
		// 3번 -> 4번
		for(int r = rowSize / 2 ; r < rowSize ; ++r) {
			for(int c = colSize / 2 ; c < colSize ; ++c) {
				result[r][c - colSize / 2] = map[r][c];
			}
		}
		
		// 4번 -> 1번 
		for(int r = rowSize / 2 ; r < rowSize ; ++r) {
			for(int c = 0 ; c < colSize / 2 ; ++c) {
				result[r - rowSize / 2][c] = map[r][c];
			}
		}
		
		map = result;
	}
	
	private static void six() {
		int[][] result = new int[map.length][map[0].length];
		
		int rowSize = map.length;
		int colSize = map[0].length;
		
		// 1번 -> 4번 
		for(int r = 0 ; r < rowSize / 2 ; ++r) {
			for(int c = 0 ; c < colSize / 2 ; ++c) {
				result[r + rowSize / 2][c] = map[r][c];
			}
		}
		
		// 4번 -> 3번
		for(int r = rowSize / 2 ; r < rowSize ; ++r) {
			for(int c = 0 ; c < colSize / 2 ; ++c) {
				result[r][c + colSize / 2] = map[r][c];
			}
		}
		
		// 3번 -> 2번
		for(int r = rowSize / 2 ; r < rowSize ; ++r) {
			for(int c = colSize / 2 ; c < colSize ; ++c) {
				result[r - rowSize / 2][c] = map[r][c];
			}
		}
		
		// 2번 -> 1번 
		for(int r = 0 ; r < rowSize / 2 ; ++r) {
			for(int c = colSize / 2 ; c < colSize ; ++c) {
				result[r][c - colSize / 2] = map[r][c];
			}
		}
		
		map = result;
	}
	
	private static void print() {
		for(int r = 0 ; r < map.length ; ++r) {
			for(int c = 0 ; c < map[0].length ; ++c) {
				System.out.print(map[r][c] + " ");
			}
			System.out.println();
		}
		System.out.println();
	}
	
}
profile
그냥 개발자

0개의 댓글