728x90
문제
크기가 n x n인 2차원 정수 배열 X가 있다. (n은 홀수)
X를 45° 의 배수만큼 시계방향 혹은 반시계방향으로 돌리려고 한다. X를 시계 방향으로 45° 돌리면 아래와 같은 연산이 동시에 X에 적용되어야 한다:
- 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의 다른 원소의 위치는 변하지 않는다.
반시계 방향으로 45° 돌리는 경우도 위와 비슷하게 정의된다.
입력
첫 줄에 테스트 케이스의 수 T가 주어진다 (1 ≤ T ≤ 10).
각 테스트 케이스에 대해: 첫 줄에 배열의 크기를 나타내는 n (1 ≤ n < 500, n은 홀수) 그리고 각도 d가 주어진다. d는 0 ≤ |d| ≤ 360 을 만족하며 |d| 는 45의 배수이다. d가 양수이면 시계방향으로 d° 돌려야 하고, 음수이면 반시계방향으로 |d|° 돌려야 한다. 다음 n줄에 걸쳐 각 줄에 n개의 정수가 공백으로 구분되어 주어진다 (X의 원소들을 나타낸다). 각 값은 1 이상 1,000,000 이하의 정수이다.
출력
각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다.
2차원 배열의 팔방 탐색에서 착안하여 구현하였다.
가운데 원소를 기준으로 팔방 회전을 하는 것과 같다. 처음에는 mid-1, mid-2 ... 0 까지 계속하면 된다.
코드를 간결하게 만들기 위해 반시계방향도 시계방향으로 통일하였다.
45도 회전하는 것을 swap 함수에 정의하였으며, 다른 회전은 45도 회전을 여러번 하는 것으로 구현하였다.
package Silver.s2;
import java.util.Scanner;
public class BOJ_17276_배열돌리기 {
static int[] dr = { -1, -1, -1, 0, 1, 1, 1, 0 }; // 왼쪽 위부터 시계방향으로 회전
static int[] dc = { -1, 0, 1, 1, 1, 0, -1, -1 };
static int[][] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int T = sc.nextInt();
for (int t = 0; t < T; t++) {
int N = sc.nextInt(); // 크기
int d = sc.nextInt(); // 각도
arr = new int[N][N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
arr[i][j] = sc.nextInt();
if (d < 0)
d += 360; // 시계방향으로 통일
d /= 45; // 45로 나눈 몫만큼 회전함
int mid = N / 2;
for (int i = 1; i <= mid; i++) {
for (int repeat = 0; repeat < d; repeat++)
swap(mid, mid, i);
}
for (int r = 0; r < N; r++) {
for (int j = 0; j < N; j++)
sb.append(arr[r][j] + " ");
sb.append("\n");
}
} // tc
System.out.print(sb.toString());
}
static void swap(int r, int c, int d) {
int tmp = arr[r + dr[7] * d][c + dc[7] * d];
for (int i = 7; i > 0; i--) {
arr[r + dr[i] * d][c + dc[i] * d] = arr[r + dr[i - 1] * d][c + dc[i - 1] * d];
}
arr[r + dr[0] * d][c + dc[0] * d] = tmp;
// 8방을 회전하기
}
}
728x90
'문제 풀이 > BOJ' 카테고리의 다른 글
[백준] 11725 - 트리의 부모 찾기 (자바/Java) (1) | 2022.08.23 |
---|---|
[백준] 2116 - 주사위 쌓기 (자바/Java) (0) | 2022.08.23 |
[백준] 10866 - 덱 Deque (자바/Java) (0) | 2022.08.18 |
[백준] 1966 - 프린터 큐 (자바/Java) (0) | 2022.08.18 |
[백준] 17298 - 오큰수 (자바/Java) (0) | 2022.08.18 |