Algorithm/baekjoon

배열 돌리기 3

마닐라 2022. 2. 20. 21:55

📍 문제 설명

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.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int n, m, v, e, k, r, answer, cnt;
    static int[] arr;
    static long[] dp;
    static int[][] board, result;
    static boolean[][] visited;
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};
    static ArrayList<Integer> list;
    static StringBuilder sb;
    static Queue<Integer> q;
    public static void main(String[] args) throws IOException {
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

        st = new StringTokenizer(br.readLine());

        for(int i = 0; i < r; i++) {
            switch (Integer.parseInt(st.nextToken())) {
                case 1 : { // 상하 반전
                    upDown();
                    break;
                }
                case 2 : { // 좌우 반전
                    leftRight();
                    break;
                }
                case 3 : { // 오른쪽 90도 회전
                    rightRotation();
                    break;
                }
                case 4 : { // 왼쪽 90도 회전
                    leftRotation();
                    break;
                }
                case 5 : { // 부분 배열 4개로 나눈 후 1->2->3->4->1 이동
                    divideMove();
                    break;
                }
                case 6 : { // 부분 배열 4개로 나눈 후 1->4->3->2->1 이동
                    divideBackMove();
                    break;
                }
            }
        }

        sb = new StringBuilder();

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

        System.out.println(sb);

        T.solution();
    }

    private static void upDown() {
        result = new int[n][m];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                result[n-i-1][j] = board[i][j];
            }
        }
        board = result;
    }
    private static void leftRight() {
        result = new int[n][m];

        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                result[i][m-j-1] = board[i][j];
            }
        }
        board = result;
    }
    private static void rightRotation() {
        //크기가 달라진다. 8 6
        result = new int[m][n];
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                result[i][j] = board[n-j-1][i];
            }
        }
        int temp = n;
        n = m;
        m = temp;
        board = result;
    }
    private static void leftRotation() {
        //크기가 달라진다.
        result = new int[m][n];
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                result[i][j] = board[j][m-i-1];
            }
        }
        int temp = n;
        n = m;
        m = temp;
        board = result;
    }
    private static void divideMove() {
        result = new int[n][m];

        int row = n / 2;
        int col = m / 2;
        //1->2
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                result[i][j+col] = board[i][j];
            }
        }
        //2->3
        for(int i = 0; i < row; i++) {
            for(int j = col; j < m; j++) {
                result[row+i][j] = board[i][j];
            }
        }
        //3->4
        for(int i = row; i < n; i++) {
            for(int j = 0; j < col; j++) {
                result[i][j] = board[i][j+col];
            }
        }
        //4->1
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                result[i][j] = board[i+row][j];
            }
        }
        board = result;
    }
    private static void divideBackMove() {
        result = new int[n][m];

        int row = n / 2;
        int col = m / 2;
        //1->4
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                result[row+i][j] = board[i][j];
            }
        }
        //4->3
        for(int i = row; i < n; i++) {
            for(int j = 0; j < col; j++) {
                result[i][j+col] = board[i][j];
            }
        }
        //3->2
        for(int i = 0; i < row; i++) {
            for(int j = col; j < m; j++) {
                result[i][j] = board[i+row][j];
            }
        }
        //2->1
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                result[i][j] = board[i][j+col];
            }
        }
        board = result;
    }


    private void solution() {

    }

    private static class Point implements Comparable<Point> {
        private int x;
        private int y;
        private int crush;

        public Point(int x, int y, int crush) {
            this.x = x;
            this.y = y;
            this.crush = crush;
        }

        @Override
        public String toString() {
            return "Point{" +
                    "x=" + x +
                    ", y=" + y +
                    ", crush=" + crush +
                    '}';
        }

        @Override
        public int compareTo(Point o) {
            return this.crush - o.crush;
        }
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

주사위 굴리기  (0) 2022.02.21
배열 돌리기 1  (0) 2022.02.21
알고스팟  (0) 2022.02.20
이모티콘  (0) 2022.02.20
숨바꼭질 4  (0) 2022.02.20