Notice
Recent Posts
Link
- Today
- Total
hye-log
[백준]16935 배열 돌리기3(JAVA) 본문
0. 문제 링크
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
1. 문제 설명
1) N*M 배열에 6가지 연산을 R번 적용하기
2. 입출력
// input
6 8 1 // N, M, R
3 2 6 3 1 2 9 7 // 배열
9 7 8 2 1 4 5 3
5 9 2 1 9 6 1 8
2 1 3 8 6 3 9 2
1 3 2 8 7 9 2 1
4 5 1 9 8 2 1 3
1 // 연산
// output
4 5 1 9 8 2 1 3
1 3 2 8 7 9 2 1
2 1 3 8 6 3 9 2
5 9 2 1 9 6 1 8
9 7 8 2 1 4 5 3
3 2 6 3 1 2 9 7
3. 코드
import java.io.*;
import java.util.*;
public class b16935 {
public static void main(String[] args) throws IOException, NumberFormatException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int R = Integer.parseInt(st.nextToken()); // 연산 횟수
int[][] map = new int[N][M];
int[][] ans = new int[N][M];
int[][] ansR = new int[M][N];
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 K, n, m;
for (int r = 0; r < R; r++) {
K = Integer.parseInt(st.nextToken()); // 수행해야 하는 연산
switch(K) {
case 1: // 상하 반전
n = map.length;
m = map[0].length;
ans = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ans[i][j] = map[n-i-1][j];
}
}
map = ans;
break;
case 2: // 좌우 반전
n = map.length;
m = map[0].length;
ans = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m ; j++) {
ans[i][j] = map[i][m-j-1];
}
}
map = ans;
break;
case 3: // 오른쪽으로 90도 회전
ansR = new int[map[0].length][map.length];
n = ansR.length;
m = ansR[0].length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ansR[i][j] = map[m-j-1][i];
}
}
map = ansR;
break;
case 4: // 왼쪽으로 90도 회전
ansR = new int[map[0].length][map.length];
n = ansR.length;
m = ansR[0].length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ansR[i][j] = map[j][n-i-1];
}
}
map = ansR;
break;
case 5: // 부분 배열로 나누어 오른쪽으로
n = map.length;
m = map[0].length;
ans = new int[n][m];
for (int i = 0; i < n; i++) {
if(i < n/2) {
for (int j = 0; j < m; j++) {
if(j < m/2) ans[i][j] = map[i+n/2][j];
else ans[i][j] = map[i][j-m/2];
}
} else {
for (int j = 0; j < m; j++) {
if(j < m/2) ans[i][j] = map[i][j+m/2];
else ans[i][j] = map[i-n/2][j];
}
}
}
map = ans;
break;
case 6: // 부분 배열을 나누어 왼쪽으로
n = map.length;
m = map[0].length;
ans = new int[n][m];
for (int i = 0; i < n; i++) {
if(i < n/2) {
for (int j = 0; j < m; j++) {
if(j < m/2) ans[i][j] = map[i][j+m/2];
else ans[i][j] = map[i+n/2][j];
}
} else {
for (int j = 0; j < m; j++) {
if(j < m/2) ans[i][j] = map[i-n/2][j];
else ans[i][j] = map[i][j-m/2];
}
}
}
map = ans;
break;
}
print(map);
}
}
private static void print(int[][] 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] + " ");
}
sb.append("\n");
}
System.out.println(sb.toString());
}
}
실행 결과
4. 회고
1) 정사각형 배열이 아닌 N*M 직사각형 배열이고, 90도 회전을 통해 배열의 크기가 M*N으로 바뀔 수 있는 점을 고려하기
2) 코드의 반복을 줄이고자 for 문, if 문으로 인덱스의 값을 계산하여 구현
5. Github
https://github.com/iihye/Algorithm/blob/main/Baekjoon/b16935.java
728x90
'CodingTest > Baekjoon' 카테고리의 다른 글
[백준]1152번 단어의 개수(JAVA) (0) | 2023.08.12 |
---|---|
[백준]12100번 2048 (Easy)(JAVA) (0) | 2023.08.11 |
[백준]16926번 배열 돌리기1(JAVA) (0) | 2023.08.10 |
[백준]7576번 토마토(JAVA) (0) | 2023.08.10 |
[백준]4963번 섬의 개수(JAVA) (0) | 2023.08.10 |
Comments