백준 16935 - 배열 돌리기 3
Updated:
Java
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 → 7 4 6 2 3 1
7 4 6 2 3 1 → 1 8 3 4 2 9
9 2 3 6 1 5 → 7 2 6 9 8 2
4 2 9 3 1 8 → 1 6 2 9 8 4
<배열> <연산 결과>
2번 연산은 배열을 좌우 반전시키는 연산이다.
1 6 2 9 8 4 → 4 8 9 2 6 1
7 2 6 9 8 2 → 2 8 9 6 2 7
1 8 3 4 2 9 → 9 2 4 3 8 1
7 4 6 2 3 1 → 1 3 2 6 4 7
9 2 3 6 1 5 → 5 1 6 3 2 9
4 2 9 3 1 8 → 8 1 3 9 2 4
<배열> <연산 결과>
3번 연산은 오른쪽으로 90도 회전시키는 연산이다.
1 6 2 9 8 4 → 4 9 7 1 7 1
7 2 6 9 8 2 → 2 2 4 8 2 6
1 8 3 4 2 9 → 9 3 6 3 6 2
7 4 6 2 3 1 → 3 6 2 4 9 9
9 2 3 6 1 5 → 1 1 3 2 8 8
4 2 9 3 1 8 → 8 5 1 9 2 4
<배열> <연산 결과>
4번 연산은 왼쪽으로 90도 회전시키는 연산이다.
1 6 2 9 8 4 → 4 2 9 1 5 8
7 2 6 9 8 2 → 8 8 2 3 1 1
1 8 3 4 2 9 → 9 9 4 2 6 3
7 4 6 2 3 1 → 2 6 3 6 3 9
9 2 3 6 1 5 → 6 2 8 4 2 2
4 2 9 3 1 8 → 1 7 1 7 9 4
<배열> <연산 결과>
5, 6번 연산을 수행하려면 배열을 크기가 N/2×M/2인 4개의 부분 배열로 나눠야 한다. 아래 그림은 크기가 6×8인 배열을 4개의 그룹으로 나눈 것이고, 1부터 4까지의 수로 나타냈다.
1 1 1 1 2 2 2 2
1 1 1 1 2 2 2 2
1 1 1 1 2 2 2 2
4 4 4 4 3 3 3 3
4 4 4 4 3 3 3 3
4 4 4 4 3 3 3 3
5번 연산은 1번 그룹의 부분 배열을 2번 그룹 위치로, 2번을 3번으로, 3번을 4번으로, 4번을 1번으로 이동시키는 연산이다.
3 2 6 3 1 2 9 7 → 2 1 3 8 3 2 6 3
9 7 8 2 1 4 5 3 → 1 3 2 8 9 7 8 2
5 9 2 1 9 6 1 8 → 4 5 1 9 5 9 2 1
2 1 3 8 6 3 9 2 → 6 3 9 2 1 2 9 7
1 3 2 8 7 9 2 1 → 7 9 2 1 1 4 5 3
4 5 1 9 8 2 1 3 → 8 2 1 3 9 6 1 8
<배열> <연산 결과>
6번 연산은 1번 그룹의 부분 배열을 4번 그룹 위치로, 4번을 3번으로, 3번을 2번으로, 2번을 1번으로 이동시키는 연산이다.
3 2 6 3 1 2 9 7 → 1 2 9 7 6 3 9 2
9 7 8 2 1 4 5 3 → 1 4 5 3 7 9 2 1
5 9 2 1 9 6 1 8 → 9 6 1 8 8 2 1 3
2 1 3 8 6 3 9 2 → 3 2 6 3 2 1 3 8
1 3 2 8 7 9 2 1 → 9 7 8 2 1 3 2 8
4 5 1 9 8 2 1 3 → 5 9 2 1 4 5 1 9
<배열> <연산 결과>
접근 방법
주어진 연산에따라 그래프의 값을 변화하였다.
구현
주목해야 할것은 3,4번이다.
그래프를 90도로 돌린다는 것은 n x m 이 m x n이 되므로,
기존의 배열을 백업한 뒤, 새롭게 new int[m][n]하여 생성한다.
새롭게 생성한 배열에 temp 배열의 값을 대입하여 회전시키고,
n, m을 서로 변경하여 행/열 크기를 갱신해준다.
코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String []args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
int n = stoi(stk.nextToken());
int m = stoi(stk.nextToken());
int r = stoi(stk.nextToken());
int arr[][] = new int[n][m];
for(int i = 0; i < n; i++) {
stk = new StringTokenizer(br.readLine());
for(int j = 0; j < m; j++)
arr[i][j] = stoi(stk.nextToken());
}
int[] oper = new int[r];
stk = new StringTokenizer(br.readLine());
for(int i = 0; i < r; i++) {
oper[i] = stoi(stk.nextToken());
}
int tmp;
int[] temp;
int[][] tempp;
for(int v : oper) {
switch(v) {
case 1:
for(int i = 0; i < n / 2; i++) {
temp = arr[i];
arr[i] = arr[n - i - 1];
arr[n - i - 1] = temp;
}
break;
case 2:
for(int i = 0; i < n; i++) {
for(int j = 0; j < m / 2; j++) {
tmp = arr[i][j];
arr[i][j] = arr[i][m - j - 1];
arr[i][m - j - 1] = tmp;
}
}
break;
case 3:
tempp = new int[n][m];
for(int i = 0; i < n; i++) {
tempp[i] = arr[i];
}
arr = new int[m][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
arr[j][n - i - 1] = tempp[i][j];
}
}
tmp = n;
n = m;
m = tmp;
break;
case 4:
tempp = new int[n][m];
for(int i = 0; i < n; i++) {
tempp[i] = arr[i];
}
arr = new int[m][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
arr[m - 1 - j][i] = tempp[i][j];
}
}
tmp = n;
n = m;
m = tmp;
break;
case 5:
tempp = new int[n/2][m/2];
for(int i = 0; i < n/2; i++) {
for(int j = 0; j < m/2; j++) {
tempp[i][j] = arr[i][j]; // 1 백업
arr[i][j] = arr[i + n/2][j]; // 4 -> 1
arr[i + n/2][j] = arr[i + n/2][j + m/2];// 3 -> 4
arr[i + n/2][j + m/2] = arr[i][j + m/2];// 2 -> 3
arr[i][j + m/2] = tempp[i][j]; // 1 -> 2
}
}
break;
case 6:
tempp = new int[n/2][m/2];
for(int i = 0; i < n/2; i++) {
for(int j = 0; j < m/2; j++) {
tempp[i][j] = arr[i][j]; // 1 백업
arr[i][j] = arr[i][j + m/2]; // 2 -> 1
arr[i][j + m/2] = arr[i + n/2][j + m/2];// 3 -> 2
arr[i + n/2][j + m/2] = arr[i + n/2][j];// 4 -> 3
arr[i + n/2][j] = tempp[i][j]; // 1 -> 4
}
}
break;
}
}
StringBuilder sb = new StringBuilder();
for(int[] a : arr) {
for(int v : a) {
sb.append(v).append(" ");
}
sb.append("\n");
}
System.out.println(sb.toString());
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}
총평
난이도
⭐⭐★★★
후기
큐빙 문제의 하위 문제라고 생각하는 문제였다.
개선할 점
없