Dazzling 개발 노트

[백준] 16926 - 배열 돌리기1 (Java) 본문

Algorithm/백준

[백준] 16926 - 배열 돌리기1 (Java)

dj._.dazzling 2023. 10. 30. 11:44

[백준] 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

참고