백준

백준 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();
    }

}

풀이

문제 자체는 크게 어려운 문제는 아니였다. 단순히 한칸씩 반시계 방향으로 옮겨주면 된다. 자세한건 코드를 보면 이해될것이다.