본문 바로가기

백준

백준 17276 배열 돌리기 (JAVA)

문제

https://www.acmicpc.net/problem/17276

 

17276번: 배열 돌리기

각 테스트 케이스에 대해 회전 연산을 마친 후 배열의 상태를 출력한다. n줄에 걸쳐 각 줄에 n개의 정수를 공백으로 구분하여 출력한다. 

www.acmicpc.net

코드

package com.company;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class Main {

    static int T, n, d, stage;
    static int[][] map;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        T = Integer.parseInt(br.readLine());
        for (int t = 0; t < T; t++) {
            st = new StringTokenizer(br.readLine());
            n = Integer.parseInt(st.nextToken());
            d = Integer.parseInt(st.nextToken());
            map = new int[n][n];

            makeMap(br);
            n--;
            stage = 0;

            for (int i = 0; i < Math.abs(d) / 45; i++) {
                while (stage < n / 2) {
                    if (d > 0)
                        calcR(n);
                    else if (d < 0)
                        calcL(n);
                    stage++;
                }
                stage=0;
            }

            for (int i = 0; i < map.length; i++) {
                for (int j = 0; j < map.length; j++) {
                    sb.append(map[i][j] + " ");
                }
                sb.append("\\n");
            }
        }

        System.out.println(sb.toString());

    }

    private static void makeMap(BufferedReader br) throws IOException {
        StringTokenizer st;
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < n; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }
    }

    private static void calcL(int n) {
        int temp;

        temp = map[stage][stage];
        map[stage][stage] = map[stage][n / 2]; //8
        map[stage][n / 2] = map[stage][n - stage]; //7
        map[stage][n - stage] = map[n / 2][n - stage]; //6
        map[n / 2][n - stage] = map[n - stage][n - stage]; //5
        map[n - stage][n - stage] = map[n - stage][n / 2]; //4
        map[n - stage][n / 2] = map[n - stage][stage];//3
        map[n - stage][stage] = map[n / 2][stage]; //2
        map[n / 2][stage] = temp;
    }

    private static void calcR(int n) {
        int temp;

        temp = map[stage][stage];
        map[stage][stage] = map[n / 2][stage]; //8
        map[n / 2][stage] = map[n - stage][stage]; //7
        map[n - stage][stage] = map[n - stage][n / 2]; //6
        map[n - stage][n / 2] = map[n - stage][n - stage]; //5
        map[n - stage][n - stage] = map[n / 2][n - stage]; //4
        map[n / 2][n - stage] = map[stage][n - stage]; //3
        map[stage][n - stage] = map[stage][n / 2]; //2
        map[stage][n / 2] = temp; //1
    }

}

풀이

문제 자체는 그렇게 어려운 문제는 아니였다. 하지만 구현에 있어서 조금 까다로웠다.

풀이는 다음과 같다.

문제 풀이

문제를 풀때 한번에 하려 하지말고 바깥에 있는 테두리 부터 시작하여 돌려준다. 이때 나는 한번에 45도씩 돌렸다. 그리고 해당 테두리에서 전부 돌리면 그 다음 테두리로 들어가서 돌려준다. 그러다 테두리를 전부 돌렸으면 반복문을 나온다. 그리고 처음에 테스트 케이스로 주어진 각도를 만족할때까지 다음을 반복한다. 또한 오른쪽으로 돌거나 왼쪽으로 도는 경우를 따로따로 생각해서 구현하였다.