https://www.acmicpc.net/problem/16935
문제 분석
- 일단 문제 시작하기 전에 4달 전에 했던 실수를 또 했다,,IndexError,,배열을 돌리고 가로세로가 바뀌는 부분을 잘 생각해줘야한다.
- 각 연산에 해당하는 메소드를 만들어서 x,y좌표값을 비교해가며 배열을 돌리면 된다.
문제 풀이
1) 세로 길이는 map.length를 이용한다.
2) 가로 길이는 map[0].length를 이용한다.
위의 두 가지를 활용하여 변화하는 가로세로 길이를 대신한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static int N, M, R;
private static int[][] map;
// main 함수
public static void main(String[] args) throws NumberFormatException, IOException {
input();
}// main 함수 종료
// input 함수
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 세로 R
M = Integer.parseInt(st.nextToken()); // 가로 C
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());
for (int i = 0; i < R; i++) {
int calculate = Integer.parseInt(st.nextToken());
if (calculate == 1) {
cal1();
} else if (calculate == 2) {
cal2();
} else if (calculate == 3) {
cal3();
} else if (calculate == 4) {
cal4();
} else if (calculate == 5) {
cal5();
} else {
cal6();
}
}
// 출력
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}// input 함수 종료
private static void cal1() {
for (int i = 0; i < map.length / 2; i++) {
for (int j = 0; j < map[0].length; j++) {
int temp = map[i][j];
map[i][j] = map[map.length - 1 - i][j];
map[map.length - 1 - i][j] = temp;
}
}
}
private static void cal2() {
for (int i = 0; i < map[0].length / 2; i++) {
for (int j = 0; j < map.length; j++) {
int temp = map[j][i];
map[j][i] = map[j][map[0].length - 1 - i];
map[j][map[0].length - 1 - i] = temp;
}
}
}
private static void cal3() {
int[][] newMap = new int[map[0].length][map.length];
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
newMap[j][map.length - 1 - i] = map[i][j];
}
}
map = newMap;
}
private static void cal4() {
int[][] newMap = new int[map[0].length][map.length];
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
newMap[map[0].length - 1 - j][i] = map[i][j];
}
}
map = newMap;
}
private static void cal5() {
int[][] newMap = new int[map.length / 2][map[0].length / 2];
// 일단 1번 그룹 임시 배열에 넣어두기
for (int i = 0; i < map.length / 2; i++) {
for (int j = 0; j < map[0].length / 2; j++) {
newMap[i][j] = map[i][j];
}
}
// 4->1
for (int i = 0; i < map.length / 2; i++) {
for (int j = 0; j < map[0].length / 2; j++) {
map[i][j] = map[i + (map.length / 2)][j];
}
}
// 3->4
for (int i = map.length / 2; i < map.length; i++) {
for (int j = 0; j < map[0].length / 2; j++) {
map[i][j] = map[i][j + (map[0].length / 2)];
}
}
// 2->3
for (int i = map.length / 2; i < map.length; i++) {
for (int j = map[0].length / 2; j < map[0].length; j++) {
map[i][j] = map[i - (map.length / 2)][j];
}
}
// 임시배열->2
for (int i = 0; i < map.length / 2; i++) {
for (int j = 0; j < map[0].length / 2; j++) {
map[i][j+(map[0].length/2)] = newMap[i][j];
}
}
}
private static void cal6() {
int[][] newMap = new int[map.length / 2][map[0].length / 2];
// 일단 1번 그룹 임시 배열에 넣어두기
for (int i = 0; i < map.length / 2; i++) {
for (int j = 0; j < map[0].length / 2; j++) {
newMap[i][j] = map[i][j];
}
}
// 2->1
for(int i=0;i<map.length/2;i++) {
for(int j=0;j<map[0].length/2;j++) {
map[i][j] = map[i][j+(map[0].length/2)];
}
}
// 3->2
for(int i=0;i<map.length/2;i++) {
for(int j=map[0].length/2;j<map[0].length;j++) {
map[i][j] = map[i+(map.length/2)][j];
}
}
// 4->3
for(int i=map.length/2;i<map.length;i++) {
for(int j=map[0].length/2;j<map[0].length;j++) {
map[i][j] = map[i][j-(map[0].length/2)];
}
}
// 임시배열->4
for(int i=0;i<map.length/2;i++) {
for (int j = 0; j < map[0].length / 2; j++) {
map[i+(map.length/2)][j] = newMap[i][j];
}
}
}
}// class 종료
'Algorithm > BOJ' 카테고리의 다른 글
BOJ 1260 DFS와 BFS (0) | 2021.08.26 |
---|---|
BOJ 14503 로봇 청소기 (0) | 2021.06.18 |
BOJ 16927 배열 돌리기 2 (0) | 2021.06.09 |
BOJ 13335 트럭 (0) | 2021.06.08 |
BOJ 16926 배열 돌리기 1 (0) | 2021.06.08 |