PS/BOJ

백준 16935 (Java) 배열 돌리기 3

akinakamori 2023. 2. 15. 17:36
728x90
SMALL

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

 

 

 

와우 진짜 너무 빡세서 나의 ADHD와의 싸움을 또 해냈다.

 

각 cmd (명령어 == 커맨드) 별로 함수를 하나씩 만들고 실행하도록 했다.

 

90도 회전의 경우 가로길이와 세로길이가 서로 바뀌기 때문에,

명령어 실행 중에 복잡해지는 것을 피하기 위해

얕은 복사로 2차원 배열이 계속 반환될 수 있게 했다.

 

그리고 cmd함수의 파라미터로 최근 실행된 결과 2차원 배열의 길이를 저장한다.

 

 

 

코드

package com.swea.d21954;

import javax.naming.spi.DirObjectFactory;
import java.io.*;
import java.util.*;

public class boj11286 {
    static int n, m, r;
    static int[][] map;
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};
    static class Pair {
        int x;
        int y;
        public Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
    static int[][] cmd1 (int[][] arr,int n, int m) {
        int[][] copy = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                copy[n - i - 1][j] = arr[i][j];
            }
        }
        return copy;
    }

    static int[][] cmd2 (int[][] arr, int n, int m) {
        int[][] copy = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                copy[i][m-1-j] = arr[i][j];
            }
        }
        return copy;
    }
    static int[][] cmd3 (int[][] arr,int n, int m) {
        int[][] copy = new int[m][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                copy[j][n-1-i] = arr[i][j];
            }
        }
        return copy;
    }

    static int[][] cmd4 (int[][] arr, int n, int m) {
        int[][] copy = new int[m][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                copy[m-1-j][i] = arr[i][j];
            }
        }
        return copy;
    }

    static int[][] cmd5 (int[][] arr,int n, int m) {
        int[][] copy = new int[n][m];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (0 <= i && i < n / 2 && 0 <= j && j < m / 2) { // 1-> 2
                    copy[i][m / 2 + j] = arr[i][j];
                } else if (0 <= i && i < n / 2 && m / 2 <= j && j < m) { // 2->3
                    copy[i + n / 2][j] = arr[i][j];
                } else if (n / 2 <= i && i < n && 0 <= j && j < m / 2) { // 4->1
                    copy[i - n/2][j] = arr[i][j];
                } else { // 3->4
                    copy[i][j - m / 2] = arr[i][j];
                }
            }
        }
        return copy;
    }

    static int[][] cmd6 (int[][] arr, int n, int m) {
        int[][] copy = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                copy[i][j] = arr[i][j];
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (0 <= i && i < n / 2 && 0 <= j && j < m / 2) { // 1-> 4
                    copy[i + n/2][j] = arr[i][j];
                } else if (0 <= i && i < n / 2 && m / 2 <= j && j < m) { // 2->1
                    copy[i][j - m/2] = arr[i][j];
                } else if (n / 2 <= i && i < n && 0 <= j && j < m / 2) { // 4->3
                    copy[i][j+m/2] = arr[i][j];
                } else { // 3->2
                    copy[i-n/2][j] = arr[i][j];
                }
            }
        }
        return copy;
    }

    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());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        r = Integer.parseInt(st.nextToken());
        map = new int[n][m];

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        st = new StringTokenizer(br.readLine());
        int[][] arr = map;
        for (int i = 0; i < r; i++) {
            int a = Integer.parseInt(st.nextToken());
            int[][] cur;
            if (a == 1) {
                cur = cmd1(arr, arr.length, arr[0].length);
            } else if (a == 2) {
                cur = cmd2(arr, arr.length, arr[0].length);
            } else if (a == 3) {
                cur = cmd3(arr, arr.length, arr[0].length);
            } else if (a == 4) {
                cur = cmd4(arr, arr.length, arr[0].length);
            } else if (a == 5) {
                cur = cmd5(arr, arr.length, arr[0].length);
            } else {
                cur = cmd6(arr, arr.length, arr[0].length);
            }
            arr = cur;
        }

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }

    }

}
728x90
LIST