728x90
SMALL
https://www.acmicpc.net/problem/16935
와우 진짜 너무 빡세서 나의 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
'PS > BOJ' 카테고리의 다른 글
백준 1753 (Java) 최단 경로 (0) | 2023.02.17 |
---|---|
백준 18352 (Java) 특정 거리의 도시 찾기 (0) | 2023.02.16 |
백준 2578 (Java) 빙고 (0) | 2023.02.09 |
백준 3584 (Java) 가장 가까운 공통 조상 (0) | 2023.02.07 |
백준 17478 (Java, C++) 재귀함수가 뭔가요? (0) | 2023.02.06 |