문제
https://www.acmicpc.net/problem/16926
여담
저번에 풀려다가 복잡해 보여서 넘어갔던 문제..! 어려워 보였는데 차근차근 푸니까 나름 괜찮았다. 달팽이 문제와 비슷한 느낌?!
풀이
회전을 1번하는 풀이 과정은 다음과 같다.
- 회전시켜야 하는 그룹의 수(k) 구하기
k = min(N, M) / 2
min(N, M) mod 2 = 0
이므로 가능한 것
- (0, 0), (1, 1), ... (k, k)를 시작점으로 선택해서 시계 반대 방향(↓ → ↑ ←)으로 회전하기
- 시작점으로 돌아오면 반복을 종료하기
- 우선 하나의 방향을 고정해서 배열을 회전시키다가, 범위를 벗어나거나 이미 기록한 위치면 회전 방향을 변경하기
- 범위를 벗어난 경우:
nx < 0 || ny < 0 || nx >= N || ny >= M
- 이미 기록한 위치:
rotateArr[nx][ny] != 0
- 범위를 벗어난 경우:
코드
import java.io.*;
import java.util.*;
public class Main {
static int N, M, R;
static int[][] originArr, rotateArr;
static int[][] move = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; // ↓ → ↑ ←
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
originArr = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < M; j++) {
originArr[i][j] = Integer.parseInt(st.nextToken());
}
}
int k = Math.min(N, M) / 2;
for (int i = 0; i < R; i++) { // 회전 횟수
rotateArr = new int[N][M];
for (int j = 0; j < k; j++) {
rotate(j);
}
copyArr(rotateArr, originArr);
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
sb.append(originArr[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb.toString());
}
static void rotate(int start) {
int x = start, y = start, idx = 0;
while (true) {
// 옮길 좌표
int nx = x + move[idx][0];
int ny = y + move[idx][1];
// 확인한 지점이 범위를 벗어나거나 이미 기록된 곳이면 방향 틀기
if (nx < 0 || ny < 0 || nx >= N || ny >= M || rotateArr[nx][ny] != 0) {
idx++;
nx = x + move[idx][0];
ny = y + move[idx][1];
}
rotateArr[nx][ny] = originArr[x][y];
if (nx == start && ny == start) break;
x = nx; y = ny;
}
}
static void copyArr(int[][] from, int[][] to) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
to[i][j] = from[i][j];
}
}
}
}
'Algorithm > 시뮬레이션' 카테고리의 다른 글
[BOJ] 2477: 참외밭 (JAVA) (0) | 2024.08.01 |
---|---|
[BOJ] 14719: 빗물 (JAVA) (1) | 2024.06.12 |
[BOJ] 1713: 후보 추천하기 (JAVA) (0) | 2024.05.13 |
[BOJ] 5212: 지구 온난화 (JAVA) (0) | 2024.05.12 |
[BOJ] 15787: 기차가 어둠을 헤치고 (JAVA) (2) | 2024.05.10 |