백준
백준 16926 배열 돌리기1 (JAVA)
sami355
2022. 8. 8. 16:35
문제
https://www.acmicpc.net/problem/16926
16926번: 배열 돌리기 1
크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]
www.acmicpc.net
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, M, R, stage = 1;
static int[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
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 + 2][M + 2];
//입력
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 1; j <= M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < R; i++) {
rotate();
stage = 1;
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
sb.append(map[i][j] + " ");
}
sb.append("\\n");
}
System.out.println(sb.toString());
}
private static void rotate() {
int start_row, end_row; //가로
int start_col, end_col; //세로
int temp;
start_row = stage;
end_row = M - (stage - 1);
start_col = stage;
end_col = N - (stage - 1);
temp = map[start_col][start_row];
if (Math.min(N, M) / 2 < stage)
return;
//상, 가로는 유동 세로는 고정
for (int i = start_row; i < end_row; i++) {
map[stage][i] = map[stage][i + 1];
}
//우, 가로는 고정 세로는 유동
for (int i = start_col; i < end_col; i++) {
map[i][end_row] = map[i + 1][end_row];
}
//하, 가로는 유동 세로는 고정
for (int i = end_row; i > start_row; i--) {
map[end_col][i] = map[end_col][i - 1];
}
//좌, 가로는 고정 세로는 유동
for (int i = end_col; i > start_col; i--) {
map[i][stage] = map[i - 1][stage];
}
map[start_col + 1][start_row] = temp;
stage++;
rotate();
}
}
풀이
문제 자체는 크게 어려운 문제는 아니였다. 단순히 한칸씩 반시계 방향으로 옮겨주면 된다. 자세한건 코드를 보면 이해될것이다.