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

 

 

문제 분석

- 일단 문제 시작하기 전에 4달 전에 했던 실수를 또 했다,,IndexError,,배열을 돌리고 가로세로가 바뀌는 부분을 잘 생각해줘야한다.

- 각 연산에 해당하는 메소드를 만들어서 x,y좌표값을 비교해가며 배열을 돌리면 된다.

 

 

문제 풀이

1) 세로 길이는 map.length를 이용한다.

2) 가로 길이는 map[0].length를 이용한다.

위의 두 가지를 활용하여 변화하는 가로세로 길이를 대신한다.

 

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

public class Main {

	private static int N, M, R;
	private static int[][] map;

	// main 함수
	public static void main(String[] args) throws NumberFormatException, IOException {
		input();
	}// main 함수 종료

	// input 함수
	private static void input() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		st = new StringTokenizer(br.readLine());

		N = Integer.parseInt(st.nextToken()); // 세로 R
		M = Integer.parseInt(st.nextToken()); // 가로 C
		R = Integer.parseInt(st.nextToken()); // 연산의 수

		map = new int[N][M];

		// 입력
		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());
		for (int i = 0; i < R; i++) {
			int calculate = Integer.parseInt(st.nextToken());
			if (calculate == 1) {
				cal1();
			} else if (calculate == 2) {
				cal2();
			} else if (calculate == 3) {
				cal3();
			} else if (calculate == 4) {
				cal4();
			} else if (calculate == 5) {
				cal5();
			} else {
				cal6();
			}

		}

		// 출력
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[0].length; j++) {
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}

	}// input 함수 종료

	private static void cal1() {
		for (int i = 0; i < map.length / 2; i++) {
			for (int j = 0; j < map[0].length; j++) {
				int temp = map[i][j];
				map[i][j] = map[map.length - 1 - i][j];
				map[map.length - 1 - i][j] = temp;
			}
		}
	}

	private static void cal2() {
		for (int i = 0; i < map[0].length / 2; i++) {
			for (int j = 0; j < map.length; j++) {
				int temp = map[j][i];
				map[j][i] = map[j][map[0].length - 1 - i];
				map[j][map[0].length - 1 - i] = temp;
			}
		}
	}

	private static void cal3() {
		int[][] newMap = new int[map[0].length][map.length];
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[0].length; j++) {
				newMap[j][map.length - 1 - i] = map[i][j];
			}
		}
		map = newMap;
	}

	private static void cal4() {
		int[][] newMap = new int[map[0].length][map.length];
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[0].length; j++) {
				newMap[map[0].length - 1 - j][i] = map[i][j];
			}
		}
		map = newMap;
	}

	private static void cal5() {
		int[][] newMap = new int[map.length / 2][map[0].length / 2];
		// 일단 1번 그룹 임시 배열에 넣어두기
		for (int i = 0; i < map.length / 2; i++) {
			for (int j = 0; j < map[0].length / 2; j++) {
				newMap[i][j] = map[i][j];
			}
		}

		// 4->1
		for (int i = 0; i < map.length / 2; i++) {
			for (int j = 0; j < map[0].length / 2; j++) {
				map[i][j] = map[i + (map.length / 2)][j];
			}
		}
		// 3->4
		for (int i = map.length / 2; i < map.length; i++) {
			for (int j = 0; j < map[0].length / 2; j++) {
				map[i][j] = map[i][j + (map[0].length / 2)];
			}
		}
		// 2->3
		for (int i = map.length / 2; i < map.length; i++) {
			for (int j = map[0].length / 2; j < map[0].length; j++) {
				map[i][j] = map[i - (map.length / 2)][j];
			}
		}
		// 임시배열->2
		for (int i = 0; i < map.length / 2; i++) {
			for (int j = 0; j < map[0].length / 2; j++) {
				map[i][j+(map[0].length/2)] = newMap[i][j];
			}
		}

	}

	private static void cal6() {
		int[][] newMap = new int[map.length / 2][map[0].length / 2];
		// 일단 1번 그룹 임시 배열에 넣어두기
		for (int i = 0; i < map.length / 2; i++) {
			for (int j = 0; j < map[0].length / 2; j++) {
				newMap[i][j] = map[i][j];
			}
		}
		
		// 2->1
		for(int i=0;i<map.length/2;i++) {
			for(int j=0;j<map[0].length/2;j++) {
				map[i][j] = map[i][j+(map[0].length/2)];
			}
		}
		// 3->2
		for(int i=0;i<map.length/2;i++) {
			for(int j=map[0].length/2;j<map[0].length;j++) {
				map[i][j] = map[i+(map.length/2)][j];
			}
		}
		// 4->3
		for(int i=map.length/2;i<map.length;i++) {
			for(int j=map[0].length/2;j<map[0].length;j++) {
				map[i][j] = map[i][j-(map[0].length/2)];
			}
		}
		// 임시배열->4
		for(int i=0;i<map.length/2;i++) {
			for (int j = 0; j < map[0].length / 2; j++) {
				map[i+(map.length/2)][j] = newMap[i][j];
			}
		}
	}
}// class 종료

'Algorithm > BOJ' 카테고리의 다른 글

BOJ 1260 DFS와 BFS  (0) 2021.08.26
BOJ 14503 로봇 청소기  (0) 2021.06.18
BOJ 16927 배열 돌리기 2  (0) 2021.06.09
BOJ 13335 트럭  (0) 2021.06.08
BOJ 16926 배열 돌리기 1  (0) 2021.06.08