ν•΄λ²„λ‹ˆ 2023. 11. 27. 10:38
λ°˜μ‘ν˜•

 

 

 

문제

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

 

16935번: λ°°μ—΄ 돌리기 3

크기가 N×M인 배열이 μžˆμ„ λ•Œ, 배열에 연산을 R번 μ μš©ν•˜λ €κ³  ν•œλ‹€. 연산은 총 6가지가 μžˆλ‹€. 1번 연산은 배열을 μƒν•˜ λ°˜μ „μ‹œν‚€λŠ” 연산이닀. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 →

www.acmicpc.net

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

풀이

λ°°μ—΄ λŒλ¦¬λ‹€κ°€ λ‚΄ 머리가 λŒμ•„κ°ˆλ»”,,ν–ˆλ‹€ 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
    /**
     * λ°°μ—΄ μƒν•˜ λ°˜μ „
     * 
     * @param arr
     * @return
     */
    public static int[][] upAndDown(int[][] arr) {

        for (int i = 0; i < arr.length / 2; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                int temp = arr[i][j];
                arr[i][j] = arr[arr.length - i - 1][j];
                arr[arr.length - i - 1][j] = temp;
            }
        }

        return arr;
    }

    /**
     * λ°°μ—΄ 쒌우 λ°˜μ „
     * 
     * @param arr
     * @return
     */
    public static int[][] leftAndRight(int[][] arr) {

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length / 2; j++) {
                int temp = arr[i][j];
                arr[i][j] = arr[i][arr[0].length - 1 - j];
                arr[i][arr[0].length - 1 - j] = temp;
            }
        }

        return arr;
    }

    /**
     * 였λ₯Έμͺ½μœΌλ‘œ 90도 νšŒμ „
     * 
     * @param arr
     * @return
     */
    public static int[][] right(int[][] arr) {
        int[][] newArr = new int[arr[0].length][arr.length];

        for (int i = 0; i < arr[0].length; i++) {
            for (int j = 0; j < arr.length; j++) {
                newArr[i][j] = arr[arr.length - 1 - j][i];
            }
        }

        return newArr;
    }

    /**
     * μ™Όμͺ½μœΌλ‘œ 90도 νšŒμ „
     * 
     * @param arr
     * @return
     */
    public static int[][] left(int[][] arr) {
        int[][] newArr = new int[arr[0].length][arr.length];

        for (int i = 0; i < arr[0].length; i++) {
            for (int j = 0; j < arr.length; j++) {
                newArr[i][j] = arr[j][arr[0].length - 1 - i];
            }
        }

        return newArr;
    }

    /**
     * λ°°μ—΄ 4λ“±λΆ„ν•΄μ„œ μ‹œκ³„λ°©ν–₯으둜 돌리기
     * 
     * @param arr
     * @return
     */
    public static int[][] quadrantRight(int[][] arr) {
        int row = arr[0].length / 2; // κ°€λ‘œ 길이
        int column = arr.length / 2; // μ„Έλ‘œ 길이
        int[][] squareArr = new int[column][row];
        // 3사뢄면 μ €μž₯ν•˜κΈ°
        for (int i = 0; i < squareArr.length; i++) {
            for (int j = 0; j < squareArr[0].length; j++) {
                squareArr[i][j] = arr[column + i][j];
            }
        }


        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < squareArr.length; j++) {
                for (int k = 0; k < squareArr[0].length; k++) {
                    // 0 μΌλ•ŒλŠ”
                    if (i == 0) {
                        arr[column + j][k] = arr[column + j][row + k];
                    } else if (i == 1) {
                        // System.out.print(i);
                        arr[column + j][row + k] = arr[j][row + k];
                    } else if (i == 2) {
                        // System.out.println(i);
                        arr[j][row + k] = arr[j][k];
                    }
                }
            }
        }

        for (int i = 0; i < squareArr.length; i++) {
            for (int j = 0; j < squareArr[0].length; j++) {
                arr[i][j] = squareArr[i][j];
            }
        }


        return arr;
    }

    /**
     * λ°°μ—΄ 4λ“±λΆ„ν•΄μ„œ λ°˜μ‹œκ³„λ°©ν–₯으둜 돌리기
     * 
     * @param arr
     * @return
     */
    public static int[][] quadrantLeft(int[][] arr) {
        int row = arr[0].length / 2; // κ°€λ‘œ 길이
        int column = arr.length / 2; // μ„Έλ‘œ 길이
        int[][] squareArr = new int[column][row];
        // 3사뢄면 μ €μž₯ν•˜κΈ°
        for (int i = 0; i < squareArr.length; i++) {
            for (int j = 0; j < squareArr[0].length; j++) {
                squareArr[i][j] = arr[column + i][j];
            }
        }


        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < squareArr.length; j++) {
                for (int k = 0; k < squareArr[0].length; k++) {
                    // 0 μΌλ•ŒλŠ”
                    if (i == 0) {
                        arr[j + column][k] = arr[j][k];
                    } else if (i == 1) {
                        arr[j][k] = arr[j][k + row];
                    } else if (i == 2) {
                        arr[j][k + row] = arr[j + column][k + row];
                    }
                }
            }
        }

        for (int i = 0; i < squareArr.length; i++) {
            for (int j = 0; j < squareArr[0].length; j++) {
                arr[i + column][j + row] = squareArr[i][j];
            }
        }


        return arr;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int r = Integer.parseInt(st.nextToken());

        int[][] arr = new int[n][m];

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < r; i++) {
            int num = Integer.parseInt(st.nextToken());

            switch (num) {
                case 1:
                    arr = upAndDown(arr);
                    break;
                case 2:
                    arr = leftAndRight(arr);
                    break;
                case 3:
                    arr = right(arr);
                    break;
                case 4:
                    arr = left(arr);
                    break;
                case 5:
                    arr = quadrantRight(arr);
                    break;
                case 6:
                    arr = quadrantLeft(arr);
                    break;
            }
        }

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                bw.write(String.valueOf(arr[i][j]) + " ");
            }
            bw.write("\n");
        }


        bw.flush();
        bw.close();
    }
}

 

 

 

 

 

 

 

 

 

 

μ •λ‹΅ 

 

 

 

 

 

 

λ°˜μ‘ν˜•