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도
    • 주대각선(왼쪽 대각선) → 가운데 열
    • 가운데 열 →  부대각선(오른쪽 대각선)
    • 부대각선(오른쪽 대각선) →  가운데 행
    • 가운데 행 →  주 대각선(왼쪽 대각선)
  • 반시계방향으로 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];
                }
            }
        }
    }
}