처음에는 각각 따로따로 돌려주려고 했는데 실패했다.
그래서 곰곰히 고민을 해본 결과 규칙이 보였다.
아래 왼쪽 위 오른쪽으로 네번의 이동이 있었고
양 끝에서 한칸씩 줄어드는것을 알 수 있었다.
import java.util.*;
import java.io.*;
public class test {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int num = Integer.parseInt(st.nextToken());
int array[][] = new int[N][M];
int answer[][] = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
array[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i=0;i<num;i++) {
turn(array,answer,N,M);
}
for(int i=0;i<N;i++) {
for (int j = 0; j < M; j++) {
sb.append(array[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb);
}
public static void turn(int array[][], int answer[][], int N, int M) {
int k=0;
while ((Math.min(N, M)/2) > k) {
for (int i = k; i < N - k - 1; i++) {
answer[i + 1][k] = array[i][k];
}
for (int i = k; i < M - k - 1; i++) {
answer[N - k - 1][i + 1] = array[N - k - 1][i];
}
for (int i = N - k - 1; i > k; i--) {
answer[i - 1][M - k - 1] = array[i][M - k - 1];
}
for (int i = M - k - 1; i > k; i--) {
answer[k][i - 1] = array[k][i];
}
k++;
}
for(int i=0;i<N;i++) {
for (int j = 0; j < M; j++) {
array[i][j]=answer[i][j];
}
}
}
}