[백준] BOJ_16926 배열 돌리기 1 JAVA

최진민·2021년 9월 13일
0

Algorithm_BOJ

목록 보기
83/92
post-thumbnail

BOJ_16926 배열 돌리기 1

문제


입력

첫째 줄에 배열의 크기 N, M과 수행해야 하는 회전의 수 R이 주어진다.

둘째 줄부터 N개의 줄에 배열 A의 원소 Aij가 주어진다.


출력

입력으로 주어진 배열을 R번 회전시킨 결과를 출력한다.


제한

  • 2 ≤ N, M ≤ 300
  • 1 ≤ R ≤ 1,000
  • min(N, M) mod 2 = 0
  • 1 ≤ Aij ≤ 108

예제 입&출력


소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    private static int[] dx = {0, 1, 0, -1};
    private static int[] dy = {1, 0, -1, 0};
    private static int[][] map;
    private static int N, M, R;
    private static int depth;

    public static void main(String[] args) throws IOException {
        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());
        depth = Math.min(N, M) / 2;

        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++) {
            for (int d = 0; d < depth; d++) {
                int curX = d;
                int curY = d;

                int temp = map[curX][curY];
                int idx = 0;

                while (idx < 4) {
                    int nextX = curX + dx[idx];
                    int nextY = curY + dy[idx];

                    if (nextX < d || nextY < d || nextX >= N - d || nextY >= M - d) {
                        idx++;
                    } else {
                        map[curX][curY] = map[nextX][nextY];
                        curX = nextX;
                        curY = nextY;
                    }
                }

                map[d+1][d] = temp;
            }
        }

        printMap();
    }

    private static void printMap() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }
}

Comment

  • 내부로 얼만큼 들어가는지 파악하는 것이 핵심이다. 필자는 depth로 표현하였고 이는 NM중 작은 수를 2로 나눴을 때, 알 수 있다.
  • 무조건 (0,0), (1,1) ...으로 시작하여 첫 값을 temp에 담아둔 후 로직을 수행하고 마지막 빈 공간에 temp를 삽입한다.
  • 또한, 유의할 점은, dxdy를 구성함에 있다. 반시계 방향으로 값을 옮기는 행위를 생각해보면 다음과 같다.
    • 1) 오른쪽 값 -> 왼쪽 (0,1) -> (0,0) -> ...
    • 2) 아래쪽 값 -> 위쪽 (1,3) -> (0,3) -> ...
    • 3) 왼쪽 값 -> 오른쪽 (3,2) -> (3,3) -> ...
    • 4) 위쪽 값 -> 아래쪽 (2,0) -> (3,0) -> ...

profile
열심히 해보자9999

0개의 댓글