Dazzling 개발 노트
[백준] 16926 - 배열 돌리기1 (Java) 본문
[백준] 16926 - 배열 돌리기1 (Java)
문제
https://www.acmicpc.net/problem/16926
풀이/후기
주어지는 배열의 겉부분과 속부분을 나눠서 회전해야 하는 점이 어려웠다.
풀이를 이것저것 찾아보니 보통 회전하는 그룹(ex. 겉부분, 속부분 등)으로 분리한 후 상, 하, 좌, 우를 각각 회전시켜주는 방법이 많았다.
회전시켜주는 방법은 복잡한 방법도 많았지만, 그래프 문제를 풀며 가장 익숙한 dir 배열을 사용해 회전시켰다.
코드
package Implementation;
import java.io.*;
import java.util.*;
public class Problem16926 {
static int N, M, R;
static int[][] arr;
static int min;
static int[][] dir = {{0,1}, {1,0}, {0,-1}, {-1,0}}; //상단, 우측, 하단, 좌측 채우기
public static void main (String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer str = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(str.nextToken());
M = Integer.parseInt(str.nextToken());
R = Integer.parseInt(str.nextToken());
arr = new int[N][M];
for (int i=0; i<N; i++){
str = new StringTokenizer(br.readLine());
for (int j=0; j<M; j++){
arr[i][j] = Integer.parseInt(str.nextToken());
}
}
min = Math.min(N,M);
for (int i=0; i<R; i++){
rotateFn();
}
printFn();
}
static void rotateFn(){
// 회전시켜야 하는 그룹의 개수 : Math.min(N,M) / 2
for (int t=0; t< (min / 2); t++){
int x = t;
int y = t;
int temp = arr[x][y];
int idx = 0;
while (idx < 4){
int nx = x + dir[idx][0];
int ny = y + dir[idx][1];
//System.out.printf("idx : %d. nx : %d / ny : %d \n", idx, nx, ny);
// 현재 회전시키는 그룹의 범위 내
if(nx < N-t && ny < M-t && nx >= t && ny >= t) {
arr[x][y] = arr[nx][ny];
x = nx;
y = ny;
} else {
idx++;
}
}
arr[t+1][t] = temp;
}
}
static void printFn(){
StringBuilder sb = new StringBuilder();
for (int i=0; i<N; i++){
for (int j=0; j<M; j++){
sb.append(arr[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb);
}
}
Commit
https://github.com/allrightDJ0108/CodingTestStudy/commit/c2bd33474f5b9ba22c543d4a198cb89242a896a8
참고