[BOJ 16935] 배열 돌리기3
업데이트:
문제
- BOJ 16935
- 문제의 저작권은 Baekjoon Online Judge에 있습니다.
접근방식
구현하는 문제라 전체적으로 어렵지는 않았다. 주의할점으로는 3,4번에서 90도 회전시키면서 N과 M이 바뀌게 되는데 이 경우만 잘 처리해주면 된다.
5,6번은 배열돌리기1,2와 똑같은 방식으로 해결하였다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, M, R; //세로,가로
static int[][] map, tmp;
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 i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
} // End input
st = new StringTokenizer(br.readLine());
for (int r = 0; r < R; r++) {
int order = Integer.parseInt(st.nextToken());
simulation(order);
}
showMap();
}
private static void showMap() {
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
private static void simulation(int order) {
int midN, midM;
switch (order) {
case 1: //상하 반전
tmp = new int[N][M];
for(int i=N-1; i>=0; i--) {
for(int j=0; j<M; j++) {
tmp[N-1-i][j] = map[i][j];
}
}
break;
case 2: //좌우 반전
tmp = new int[N][M];
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
tmp[i][M-1-j] = map[i][j];
}
}
break;
case 3: //오른쪽 90도회전
tmp = new int[M][N];
for(int j=0; j<M; j++) {
for(int i=N-1; i>=0; i--) {
tmp[j][N-1-i] = map[i][j];
}
}
break;
case 4: //왼쪽 90도 회전
tmp = new int[M][N];
for(int j=M-1; j>=0; j--) {
for(int i=0; i<N; i++) {
tmp[M-1-j][i] = map[i][j];
}
}
break;
case 5: //1번->2->3->4->1
tmp = new int[N][M];
midN = N/2;
midM = M/2;
//1->2
for(int i=0; i<midN; i++) {
for(int j=0; j<midM; j++) {
tmp[i][j+midM] = map[i][j];
}
}
//2->3
for(int i=0; i<midN; i++) {
for(int j=midM; j<M; j++) {
tmp[i+midN][j] = map[i][j];
}
}
//3->4
for(int i=midN; i<N; i++) {
for(int j=midM; j<M; j++) {
tmp[i][j-midM] = map[i][j];
}
}
//4->1
for(int i=midN; i<N; i++) {
for(int j=0; j<midM; j++) {
tmp[i-midN][j] = map[i][j];
}
}
break;
case 6://1->4->3->2->1
tmp = new int[N][M];
midN = N/2;
midM = M/2;
//1->4
for(int i=0; i<midN; i++) {
for(int j=0; j<midM; j++) {
tmp[i+midN][j] = map[i][j];
}
}
//4->3
for(int i=midN; i<N; i++) {
for(int j=0; j<midM; j++) {
tmp[i][j+midM] = map[i][j];
}
}
//3->2
for(int i=midN; i<N; i++) {
for(int j=midM; j<M; j++) {
tmp[i-midN][j] = map[i][j];
}
}
//2->1
for(int i=0; i<midN; i++) {
for(int j=midM; j<M; j++) {
tmp[i][j-midM] = map[i][j];
}
}
break;
default:
break;
}
copyMap(tmp);
}
private static void copyMap(int[][] tmp) {
N = tmp.length;
M = tmp[0].length;
map = tmp;
}
}