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

dev_kiiim·2022년 12월 13일

CODING TEST

목록 보기
16/23
post-thumbnail

지난 주에 풀어본 문제를 정리해보려고 한다.
페어코딩 스터디에서 풀어본 문제로 주어진 배열을 반시계방향으로 한칸씩 이동하는 문제였다.


public static void main(String[] args) throws IOException {
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    String[] input = bf.readLine().split(" ");
    int N = Integer.parseInt(input[0]);
    int M = Integer.parseInt(input[1]);
    int R = Integer.parseInt(input[2]);
    int[][] board = new int[N][M];
    for (int i = 0; i < N; i++) {
        String[] st = bf.readLine().split(" ");
        for (int j = 0; j < M; j++) {
            board[i][j] = Integer.parseInt(st[j]);
        }
    }

    int part = Math.min(N,M) / 2;
    for (int i = 0; i < R; i++) {
        int[][] out = new int[N][M];
        for (int j = 0; j < part; j++) {
            for (int k = j+1; k < M-j; k++) {
                out[j][k-1] = board[j][k];
            }
            for (int l = j; l < M-1-j ; l++) {
                out[N-1-j][l+1] = board[N-1-j][l];
            }
            for (int h = N-1-j; h > j; h--) {
                out[h][j] = board[h-1][j];
            }
            for (int g = N-1-j; g > j; g--) {
                out[g-1][M-1-j] = board[g][M-1-j];
            }
        }
        board = out.clone();
    }

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            System.out.print(board[i][j] + " ");
        }
        System.out.println();
    }
}

풀이를 말로 설명하기 어렵지만, 설명을 적어보자면
회전하는 구역(part)를 우선적으로 알아야하는데 주어진 이차원 배열을 표로 만들었을 때 가장 바깥에서 회전하는 구역부터 가장 안쪽의 구역까지 회전을 시켜야 하기 때문이다.
그 다음으로 그 구역에서 상하좌우가 움직이는 방향이 모두 다르므로 각각의 방향마다 for문으로 구현을 해주었다.
이 부분에서 for문의 조건부분과 실행부분에 맞는 값을 생각하는 것이 가장 어려웠다.

과연 시간제한이 있다면 시간안에 풀어낼 수 있을지,, 걱정이다😅

0개의 댓글