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.BufferedWriter;
import java.io.InputStreamReader;
import java.util.*;
class Main {
static BufferedReader br;
static BufferedWriter bw;
static StringTokenizer st;
static StringBuilder sb;
public static void main(String[] args) throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
sb = new StringBuilder();
st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
int calc = Integer.parseInt(st.nextToken());
map = new int[R][C];
for (int i = 0; i < R; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < C; j++)
map[i][j] = Integer.parseInt(st.nextToken());
}
st=new StringTokenizer(br.readLine());
for(int i=0;i<calc;i++) {
switch(st.nextToken()) {
case "1": one();break;
case "2": two();break;
case "3": three();break;
case "4": four();break;
case "5": five();break;
case "6": six();
}
}
for (int[] mp : map) {
for (int v : mp)
sb.append(v+" ");
sb.append("\n");
}
System.out.println(sb);
}
static int R, C;
static int[] map[];
private static void one() { // 상하 반전
for (int i = 0; i < R / 2; i++) {
int tmp[] = Arrays.copyOf(map[i], C);
map[i] = map[R - 1 - i];
map[R - 1 - i] = tmp;
}
}
private static void two() { // 좌우 반전
int tmp;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C / 2; j++) {
tmp = map[i][j];
map[i][j] = map[i][C - j - 1];
map[i][C - j - 1] = tmp;
}
}
}
private static void three() { // 오른쪽 90도
int[][] tmpArray = new int[R][C];
for (int i = 0; i < R; i++)
tmpArray[i] = Arrays.copyOf(map[i], C);
map = new int[C][R];
int tmp = R;
R = C;
C = tmp;
for (int i = 0; i < R; i++)
for (int j = 0; j < C; j++)
map[i][j] = tmpArray[C - j - 1][i];
}
private static void four() { // 왼쪽 90도
int[][] tmpArray = new int[R][C];
for (int i = 0; i < R; i++)
tmpArray[i] = Arrays.copyOf(map[i], C);
map = new int[C][R];
int tmp = R;
R = C;
C = tmp;
for (int i = 0; i < R; i++)
for (int j = 0; j < C; j++)
map[i][j] = tmpArray[j][R - i - 1];
}
private static void five() {
int[][] tmpArray = new int[R][C];
for (int i = 0; i < R; i++)
tmpArray[i] = Arrays.copyOf(map[i], C);
for (int i = 0; i < R / 2; i++) { // 4사분면
for (int j = 0; j < C / 2; j++)
map[i][j] = tmpArray[i + R / 2][j];
}
for (int i = 0; i < R / 2; i++) { // 1사분면
for (int j = C / 2; j < C; j++)
map[i][j] = tmpArray[i][j - C / 2];
}
for (int i = R / 2; i < R; i++) { // 2사분면
for (int j = C / 2; j < C; j++)
map[i][j] = tmpArray[i - R / 2][j];
}
for (int i = R / 2; i < R; i++) { // 3사분면
for (int j = 0; j < C / 2; j++)
map[i][j] = tmpArray[i][j + C / 2];
}
}
private static void six() {
int[][] tmpArray = new int[R][C];
for (int i = 0; i < R; i++)
tmpArray[i] = Arrays.copyOf(map[i], C);
for (int i = 0; i < R / 2; i++) { // 4사분면
for (int j = 0; j < C / 2; j++)
map[i][j] = tmpArray[i][j + C / 2];
}
for (int i = 0; i < R / 2; i++) { // 1사분면
for (int j = C / 2; j < C; j++)
map[i][j] = tmpArray[i + R / 2][j];
}
for (int i = R / 2; i < R; i++) { // 2사분면
for (int j = C / 2; j < C; j++)
map[i][j] = tmpArray[i][j - C / 2];
}
for (int i = R / 2; i < R; i++) { // 3사분면
for (int j = 0; j < C / 2; j++)
map[i][j] = tmpArray[i - R / 2][j];
}
}
}
'Algorithm > 문제' 카테고리의 다른 글
[백준 / JAVA] 20055. 컨베이어 벨트 위의 로봇 (G5) (0) | 2024.04.10 |
---|---|
[백준 / JAVA] 3190. 뱀 (G4) (0) | 2024.04.07 |
[백준 / JAVA] 16927. 배열 돌리기 2 (G5) (0) | 2023.08.26 |
[백준 / JAVA] 1107. 리모컨 (G5) (0) | 2023.08.16 |
[백준 / C#] 10868. 최솟값 (G1) (0) | 2022.08.11 |