목차
문제 : 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);
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 19953 - 영재의 산책 (java) (0) | 2024.03.18 |
---|---|
[자바] 백준 1953 - 팀배분 (java) (0) | 2024.02.26 |
[자바] 백준 17436 - 소수의 배수 (java) (0) | 2024.02.24 |
[자바] 백준 24956 - 나는 정말 휘파람을 못 불어 (java) (0) | 2024.02.24 |
[자바] 백준 16563 - 어려운 소인수분해 (java) (0) | 2024.02.23 |
댓글