크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다.
예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.
배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.
첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.
둘째 줄부터 N개의 줄에 배열 A의 원소 A(ij)가 주어진다.
입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.
4 4 2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
3 4 8 12
2 11 10 16
1 7 6 15
5 9 13 14
5 4 7
1 2 3 4
7 8 9 10
13 14 15 16
19 20 21 22
25 26 27 28
28 27 26 25
22 9 15 19
16 8 21 13
10 14 20 7
4 3 2 1
2 2 3
1 1
1 1
1 1
1 1
swapping을 해야하는 걸 알고 임시변수를 만들었지만 어떻게 전체적으로 회전시킬지를 몰랐다. 많은 풀이에서 회전시켜야 하는 그룹의 갯수를 Math.min(N, M) / 2으로 했지만, 이 아이디어를 떠올리기가 어렵기도 했고 for문의 조건식을 설정하는게 너무 복잡하다는 생각이 들었다.
그래서 BFS 풀이처럼 4개의 swapping 방향에 대해 for문을 실행해서 범위를 나갔을 경우 다음 방향으로 swapping하는 식으로 구현했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N, M, R;
static int[][] A;
static boolean[][] visited;
public void solution() {
for (int i = 0; i < R; i++) {
int r1 = 0, r2 = N - 1;
int c1 = 0, c2 = M - 1;
while (r1 < r2 && c1 < c2) {
int temp = A[r1][c1];
// 윗변에서 왼쪽으로
for (int c = c1; c < c2; c++) {
A[r1][c] = A[r1][c + 1];
}
// 오른쪽 변에서 위쪽으로
for (int r = r1; r < r2; r++) {
A[r][c2] = A[r + 1][c2];
}
// 아랫변에서 오른쪽으로
for (int c = c2; c > c1; c--) {
A[r2][c] = A[r2][c - 1];
}
// 왼쪽 변에서 아래쪽으로
for (int r = r2; r > r1; r--) {
A[r][c1] = A[r - 1][c1];
}
A[r1 + 1][c1] = temp;
r1 += 1;
c1 += 1;
r2 -= 1;
c2 -= 1;
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
sb.append(A[i][j]).append(" ");
}
sb.append("\n");
}
System.out.print(sb);
}
public static void main(String[] args) throws IOException {
Main main = new Main();
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());
A = new int[N][M];
visited = new boolean[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
A[i][j] = Integer.parseInt(st.nextToken());
}
}
main.solution();
}
}
시뮬레이션 문제인데 생각보다 구현하는데 오래 걸렸으니 익숙해지도록 노력해야겠다!