본문 바로가기

백준

백준 16926 배열 돌리기1 (JAVA)

문제

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

}

풀이

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

'백준' 카테고리의 다른 글

백준 20164 홀수홀릭호석 (JAVA)  (0) 2022.08.10
백준 20207 달력(JAVA)  (0) 2022.08.10
백준 15787 기차가 어둠을 헤치고 은하수를  (0) 2022.08.05
백준 17276 배열 돌리기 (JAVA)  (0) 2022.08.04
백준 2615 오목 (JAVA)  (0) 2022.08.04