본문 바로가기
PS/BOJ

[자바] 백준 16935 - 배열 돌리기 3 (java)

by Nahwasa 2024. 2. 26.

문제 : boj16935

 

 

 

필요 알고리즘

  • 구현력(?)
    • 그저 제시된 대로 구현만 잘 하면 풀 수 있는 문제이다.

※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.

 

 

풀이

  그냥 제시된 대로 동작하도록 구현만 해주면 되는 문제이다. 경우에 따라 쉽지 않을 수 있긴 하다.

그래도 RPG Extreme (백준 17081) 같은 구현문제보다는 귀여운 편이다.

기왕 구현하는거 최대한 깔끔하게 한번 짜보면 개발 연습도 되고 좋다.

 

 

코드 : github

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

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1 << 16);

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }

    int[][] arr;
    int op;

    public void solution() throws Exception {
        init();
        StringTokenizer st = new StringTokenizer(br.readLine());
        while (op-->0) {
            Operation op = null;
            switch (Integer.parseInt(st.nextToken())) {
                case 1: op = new Op1(); break;
                case 2: op = new Op2(); break;
                case 3: op = new Op3(); break;
                case 4: op = new Op4(); break;
                case 5: op = new Op5(); break;
                case 6: op = new Op6(); break;
            }

            arr = op.proc(arr);
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                sb.append(arr[i][j]).append(' ');
            }
            sb.append('\n');
        }
        System.out.print(sb);
    }

    private void init() throws IOException {
        StringTokenizer st = new StringTokenizer(br.readLine());
        int r = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        op = Integer.parseInt(st.nextToken());

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

abstract class Operation {
    int[][] base;
    int r, c;

    protected void commit(int[][] arr) {
        this.base = arr;
    }

    public int[][] proc(int[][] arr) {
        this.base = arr;
        this.r = arr.length;
        this.c = arr[0].length;

        procEachOp();

        return this.base;
    }

    abstract protected void procEachOp();
}

class Op1 extends Operation {
    @Override
    protected void procEachOp() {
        int[][] arr = new int[r][c];
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                arr[r-1-i][j] = base[i][j];
            }
        }
        commit(arr);
    }
}

class Op2 extends Operation {
    @Override
    protected void procEachOp() {
        int[][] arr = new int[r][c];
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                arr[i][c-1-j] = base[i][j];
            }
        }
        commit(arr);
    }
}

class Op3 extends Operation {
    @Override
    protected void procEachOp() {
        int[][] arr = new int[c][r];
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                arr[j][r-1-i] = base[i][j];
            }
        }
        commit(arr);
    }
}

class Op4 extends Operation {
    @Override
    protected void procEachOp() {
        int[][] arr = new int[c][r];
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                arr[c-1-j][i] = base[i][j];
            }
        }
        commit(arr);
    }
}

class Op5 extends Operation {
    @Override
    protected void procEachOp() {
        int[][] arr = new int[r][c];
        for (int i = 0; i < r/2; i++) for (int j = 0; j < c/2; j++) arr[i][c/2+j] = base[i][j];
        for (int i = 0; i < r/2; i++) for (int j = c/2; j < c; j++) arr[r/2+i][j] = base[i][j];
        for (int i = r/2; i < r; i++) for (int j = c/2; j < c; j++) arr[i][j-c/2] = base[i][j];
        for (int i = r/2; i < r; i++) for (int j = 0; j < c/2; j++) arr[i-r/2][j] = base[i][j];

        commit(arr);
    }
}

class Op6 extends Operation {
    @Override
    protected void procEachOp() {
        int[][] arr = new int[r][c];
        for (int i = 0; i < r/2; i++) for (int j = 0; j < c/2; j++) arr[r/2+i][j] = base[i][j];
        for (int i = 0; i < r/2; i++) for (int j = c/2; j < c; j++) arr[i][j-c/2] = base[i][j];
        for (int i = r/2; i < r; i++) for (int j = c/2; j < c; j++) arr[i-r/2][j] = base[i][j];
        for (int i = r/2; i < r; i++) for (int j = 0; j < c/2; j++) arr[i][j+c/2] = base[i][j];

        commit(arr);
    }
}