배열의 회전을 구현하기만 하면 되는 시뮬레이션이다.
첫번째 시도 (실패)
import java.io.*;
import java.util.*;
public class Main {
static int N, M, R, map[][];
static boolean[][] v;
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());
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());
}
}
for(int i=0; i<R; i++) {
v = new boolean[N][M];
rotate();
}
StringBuilder sb = new StringBuilder();
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
sb.append(map[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb);
}
static int[] dr = {1, 0, -1, 0};
static int[] dc = {0, 1, 0, -1};
static void rotate() {
for(int i=0; i<M/2; i++) {
int d = 0;
int prev = map[i][i];
int nr = i;
int nc = i;
while(!(nr == i && nc == i && v[i][i])) {
nr += dr[d];
nc += dc[d];
if((nr < 0 || nc < 0 || nr >= N || nc >= M) || v[nr][nc]) {
nr -= dr[d];
nc -= dc[d];
d = (d+1) % 4;
continue;
}
int temp = map[nr][nc];
map[nr][nc] = prev;
prev = temp;
v[nr][nc] = true;
}
}
}
}
🔥 회전할 때 테두리의 회전이 끝났으면 안쪽으로 들어가는 로직을 반복문을 통해 M/2번 실행되게 된다. 하지만 이 로직은 N > M 일 경우에만 유효한 코드이다.
따라서 반복문의 조건을 M/2가 아닌 Math.min(N, M)/2 로 수정했다.
두 번째 시도 (성공)
import java.io.*;
import java.util.*;
public class Main {
static int N, M, R, map[][];
static boolean[][] v;
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());
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());
}
}
for(int i=0; i<R; i++) {
v = new boolean[N][M];
rotate();
}
StringBuilder sb = new StringBuilder();
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
sb.append(map[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb);
}
static int[] dr = {1, 0, -1, 0};
static int[] dc = {0, 1, 0, -1};
static void rotate() {
for(int i=0; i<Math.min(N, M); i++) {
int d = 0;
int prev = map[i][i];
int nr = i;
int nc = i;
while(!(nr == i && nc == i && v[i][i])) {
nr += dr[d];
nc += dc[d];
if((nr < 0 || nc < 0 || nr >= N || nc >= M) || v[nr][nc]) {
nr -= dr[d];
nc -= dc[d];
d = (d+1) % 4;
continue;
}
int temp = map[nr][nc];
map[nr][nc] = prev;
prev = temp;
v[nr][nc] = true;
}
}
}
}
'알고리즘' 카테고리의 다른 글
[알고리즘 이론] 벨만-포드 알고리즘 (0) | 2025.04.30 |
---|---|
[Boj2240] 자두나무 (1) | 2024.11.20 |
[BOJ1068] 트리 (1) | 2024.11.16 |
[코드트리 조별과제] 부분 수열의 합이 K (누적합) (1) | 2024.08.20 |
[코드트리 조별과제] 두 수의 합 (HashMap) (0) | 2024.08.18 |