https://www.acmicpc.net/problem/16926
크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다.
A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5]
↓ ↑
A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]
↓ ↓ ↑ ↑
A[3][1] A[3][2] → A[3][3] → A[3][4] A[3][5]
↓ ↑
A[4][1] → A[4][2] → A[4][3] → A[4][4] → A[4][5]
예를 들어, 아래와 같은 배열을 2번 회전시키면 다음과 같이 변하게 된다.
1 2 3 4 2 3 4 8 3 4 8 6
5 6 7 8 1 7 7 6 2 7 8 2
9 8 7 6 → 5 6 8 2 → 1 7 6 3
5 4 3 2 9 5 4 3 5 9 5 4
<시작> <회전1> <회전2>
배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.
rotate 함수에 배열을 전체적으로 한 번 돌리는 코드를 4방을 이용하여 구현하였다.map[i][i]가 될 것이다.Math.min(N, M) / 2가 된다.cur에 저장해두고prev를 해당 자리에 넣어주면서 갱신했다.prev = cur로 바꾼다.import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_S1_16926_배열돌리기1 {
static int N, M, R;
static int[][] map;
static int[] dr = { 1, 0, -1, 0 }; // 하 우 상 좌
static int[] dc = { 0, 1, 0, -1 };
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());
}
}
for (int i = 0; i < R; i++) {
rotate();
}
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 rotate() {
int x = Math.min(N, M);
for (int i = 0; i < x/2; i++) {
int r = i;
int c = i;
int d = 0;
int cur = 0;
int prev = map[i][i];
while(d<4) {
int nr = r + dr[d];
int nc = c + dc[d];
if(!(nr>=0+i && nc>=0+i && nr<N-i && nc<M-i)) {
d++;
continue;
}
cur = map[nr][nc];
map[nr][nc] = prev;
prev = cur;
r = nr;
c = nc;
}
}
}
}