첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.
둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.
입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static int[] dx = {0, 1, 0, -1};
private static int[] dy = {1, 0, -1, 0};
private static int[][] map;
private static int N, M, R;
private static int depth;
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());
depth = Math.min(N, M) / 2;
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());
}
}
for (int i = 0; i < R; i++) {
for (int d = 0; d < depth; d++) {
int curX = d;
int curY = d;
int temp = map[curX][curY];
int idx = 0;
while (idx < 4) {
int nextX = curX + dx[idx];
int nextY = curY + dy[idx];
if (nextX < d || nextY < d || nextX >= N - d || nextY >= M - d) {
idx++;
} else {
map[curX][curY] = map[nextX][nextY];
curX = nextX;
curY = nextY;
}
}
map[d+1][d] = temp;
}
}
printMap();
}
private static void printMap() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
}
depth
로 표현하였고 이는 N
과 M
중 작은 수를 2
로 나눴을 때, 알 수 있다.(0,0)
, (1,1)
...
으로 시작하여 첫 값을 temp
에 담아둔 후 로직을 수행하고 마지막 빈 공간에 temp
를 삽입한다.dx
와 dy
를 구성함에 있다. 반시계 방향으로 값을 옮기는 행위를 생각해보면 다음과 같다.(0,1)
-> (0,0)
-> ...
(1,3)
-> (0,3)
-> ...
(3,2)
-> (3,3)
-> ...
(2,0)
-> (3,0)
-> ...