PS/백준
[백준][Java] 17276번 : 배열돌리기
nyrimmm
2025. 6. 22. 02:31
[문제 링크]
https://www.acmicpc.net/problem/17276
문제 설명
배열 X를 45도 배수만큼 시계방향 or 반시계방향으로 돌린다.
시계방향으로 45도를 돌리면 아래와 같은 연산을 적용한다.
1. 주대각선(왼쪽 대각선) → 가운데 열
2. 가운데 열 → 부대각선(오른쪽 대각선)
3. 부대각선(오른쪽 대각선) → 가운데 행
5. 가운데 행 → 주대각선(왼쪽 대각선)
6. 다른 원소의 위치는 변하지 않는다.
반시계방향은 위 연산을 반대 방향으로 적용
입력받은 회전 각도만큼 배열을 돌렸을 때, 배열을 출력한다.
시계방향으로 45도를 돌리면 아래와 같은 연산을 적용한다.
1. 주대각선(왼쪽 대각선) → 가운데 열
2. 가운데 열 → 부대각선(오른쪽 대각선)
3. 부대각선(오른쪽 대각선) → 가운데 행
5. 가운데 행 → 주대각선(왼쪽 대각선)
6. 다른 원소의 위치는 변하지 않는다.
반시계방향은 위 연산을 반대 방향으로 적용
입력받은 회전 각도만큼 배열을 돌렸을 때, 배열을 출력한다.
문제 풀이
배열을 시계방향, 반시계방향으로 돌리는 연산 규칙은 아래와 같다.
- 시계방향으로 45도
- 주대각선(왼쪽 대각선) → 가운데 열
- 가운데 열 → 부대각선(오른쪽 대각선)
- 부대각선(오른쪽 대각선) → 가운데 행
- 가운데 행 → 주 대각선(왼쪽 대각선)
- 반시계방향으로 45도
- 주대각선(왼쪽 대각선) → 가운데 행
- 가운데 행 → 부대각선(오른쪽 대각선)
- 부대각선(오른쪽 대각선) → 가운데 열
- 가운데 열 → 주대각선(왼쪽 대각선)
위의 연산 규칙을 그대로 구현하면 된다.
원본배열 array을 입력받을 때, 회전한 결과 배열 copy도 생성해서 array를 복사한다.
총 회전횟수는 |d| / 45 번 이고, 한 번 회전이 끝나면 배열 copy를 배열 array에 복사하고 다음 회전을 수행한다.
전체코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int t, n, d;
static int[][] array;
static int[][] copy;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
t = Integer.parseInt(br.readLine());
for (int k = 0; k < t; k++) {
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken()); //배열의 크기
d = Integer.parseInt(st.nextToken()); //각도
array = new int[n + 1][n + 1];
copy = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 1; j <= n; j++) {
array[i][j] = Integer.parseInt(st.nextToken());
copy[i][j] = array[i][j];
}
}
int midIdx = (n + 1) / 2;
if (d > 0) { //시계방향
rotateRight(d / 45, midIdx);
} else if (d < 0) { //반시계방향
rotateLeft(Math.abs(d) / 45, midIdx);
}
//결과 출력
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
System.out.print(copy[i][j] + " ");
}
System.out.println();
}
}
}
//시계방향
public static void rotateRight(int d, int midIdx) {
while(d > 0) {
for (int i = 1; i <= n; i++) {
//주대각선(왼쪽대각선) -> 가운데 열
copy[i][midIdx] = array[i][i];
//가운데 열 -> 부대각선(오른쪽대각선)
copy[i][n - i + 1] = array[i][midIdx];
//부대각선(오른쪽대각선) -> 가운데 행
copy[midIdx][n - i + 1] = array[i][n - i + 1];
//가운데 행 -> 주대각선(왼쪽대각선)
copy[i][i] = array[midIdx][i];
}
d--;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
array[i][j] = copy[i][j];
}
}
}
}
//반시계방향
public static void rotateLeft(int d, int midIdx) {
while(d > 0) {
for (int i = 1; i <= n; i++) {
//주대각선(왼쪽대각선) -> 가운데 행
copy[midIdx][i] = array[i][i];
//가운데 행 -> 부대각선(오른쪽 대각선)
copy[n - i + 1][i] = array[midIdx][i];
//부대각선(오른쪽 대각선) -> 가운데 열
copy[n - i + 1][midIdx] = array[n - i + 1][i];
//가운데 열 -> 주대각선(왼쪽 대각선)
copy[i][i] = array[i][midIdx];
}
d--;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
array[i][j] = copy[i][j];
}
}
}
}
}