문제
https://www.acmicpc.net/problem/17276
여담
시계 방향으로 회전하는 것과 반시계 방향으로 회전하는 것을 나눠서 풀었는데, 해당 블로그를 보고 반시계 방향을 따로 구현하지 않아도 된다는 것을 알았다..! 처음에 제대로 정리를 하지 않고 풀었더니 좌표를 이동시키는 과정에서 조금 헷갈렸고, 중간값에 -1을 해주지 않아서 조금 헤맸다..ㅎ 제발 문제를 풀기 전에 잘 정리하고 풀라고...
풀이
이 문제는 단순 구현이기 때문에 문제에서 주어진 조건대로 구현하면 된다. 이때, 반시계 방향은 d + 360
도 시계 방향으로 회전시키는 것과 같기 때문에 시계 방향으로 회전하는 것만 구현하면 된다.
문제에서 주어진 조건은 다음과 같다.
- X의 주 대각선을 ((1,1), (2,2), …, (n, n)) 가운데 열 ((n+1)/2 번째 열)로 옮긴다.
- X의 가운데 열을 X의 부 대각선으로 ((n, 1), (n-1, 2), …, (1, n)) 옮긴다.
- X의 부 대각선을 X의 가운데 행 ((n+1)/2번째 행)으로 옮긴다.
- X의 가운데 행을 X의 주 대각선으로 옮긴다.
- 위 네 가지 경우 모두 원소의 기존 순서는 유지 되어야 한다.
- X의 다른 원소의 위치는 변하지 않는다.
이것을 그림과 식으로 표현하면 다음과 같다.
따라서 d / 45
횟수만큼 시계 방향으로 회전시키면 된다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int T, n, d, mid;
static int[][] arr, rotate;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
T = Integer.parseInt(br.readLine());
for (int t = 0; t < T; t++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
mid = (n + 1) / 2 - 1; // 중간값
arr = new int[n][n];
rotate = new int[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
arrCopy(rotate, arr);
if (d % 360 != 0) { // 각도가 0 또는 360이면 원래 위치로 돌아옴
rotate();
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sb.append(arr[i][j]).append(" ");
}
sb.append("\n");
}
}
System.out.println(sb.toString());
}
public static void rotate() {
int rotateCnt = (d < 0 ? d + 360 : d) / 45; // 반시계 방향 = 'd + 360' 시계 방향
for (int r = 0; r < rotateCnt; r++) {
for (int i = 0; i < n; i++) {
rotate[i][mid] = arr[i][i]; // 주 대각선 회전
rotate[i][n - 1 - i] = arr[i][mid]; // 가운데 열 회전
rotate[mid][i] = arr[n - 1 - i][i]; // 부 대각선 회전
rotate[i][i] = arr[mid][i]; // 가운데 행 회전
}
arrCopy(arr, rotate); // 이동한 것 복사하기
}
}
public static void arrCopy(int[][] target, int[][] origin) { // 2차원 배열 복사
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
target[i][j] = origin[i][j];
}
}
}
}
'Algorithm > 시뮬레이션' 카테고리의 다른 글
[BOJ] 5212: 지구 온난화 (JAVA) (0) | 2024.05.12 |
---|---|
[BOJ] 15787: 기차가 어둠을 헤치고 (JAVA) (2) | 2024.05.10 |
[BOJ] 22858: 원상 복구 (small) (JAVA) (1) | 2024.03.26 |
[BOJ] 20291: 파일 정리 (JAVA) (0) | 2024.03.23 |
[BOJ] 12933: 오리 (JAVA) (1) | 2024.03.22 |