[백준][Java] 17276번 : 배열돌리기

2025. 6. 22. 02:31·PS/백준

[문제 링크]

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];
                }
            }
        }
    }
}

 

저작자표시 비영리 변경금지 (새창열림)

'PS > 백준' 카테고리의 다른 글

[백준][Java] 20437번 : 문자열 게임 2  (1) 2025.06.30
[백준][Java] 18428번 : 감시 피하기  (1) 2025.06.22
[백준][Java] 16987번 : 계란으로 계란치기  (2) 2025.06.18
[백준][Java] 15686번 : 치킨배달  (2) 2025.06.04
[백준][Java] 6603번 : 로또  (0) 2025.05.27
'PS/백준' 카테고리의 다른 글
  • [백준][Java] 20437번 : 문자열 게임 2
  • [백준][Java] 18428번 : 감시 피하기
  • [백준][Java] 16987번 : 계란으로 계란치기
  • [백준][Java] 15686번 : 치킨배달
nyrimmm
nyrimmm
  • nyrimmm
    개발기록
    nyrimmm
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (85)
      • Java (6)
      • Spring & SpringBoot (3)
      • Network (1)
      • DataBase (0)
      • SQL (1)
      • IntelliJ (3)
      • Git (0)
      • 자료구조 & 알고리즘 (2)
      • 트러블 슈팅 (1)
        • Spring (1)
      • PS (67)
        • 백준 (24)
        • 프로그래머스 (0)
        • SQL (10)
        • 이코테 (33)
      • 후기 & 회고 (1)
  • 태그

  • 인기 글

  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
nyrimmm
[백준][Java] 17276번 : 배열돌리기
상단으로

티스토리툴바