백준 - 16926번(배열 돌리기 1)

최지홍·2022년 2월 9일
0

백준

목록 보기
36/145

문제 출처: https://www.acmicpc.net/problem/16926


  • 크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다.
  • 배열과 정수 R이 주어졌을 때, 배열을 R번 회전시킨 결과를 구해보자.

  • 반복문 버전
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tokenizer = new StringTokenizer(reader.readLine());

        int N = Integer.parseInt(tokenizer.nextToken());
        int M = Integer.parseInt(tokenizer.nextToken());
        int R = Integer.parseInt(tokenizer.nextToken());
        int[][] matrix = new int[N][M];

        for (int i = 0; i < N; i++) {
            tokenizer = new StringTokenizer(reader.readLine());
            for (int j = 0; j < M; j++) {
                matrix[i][j] = Integer.parseInt(tokenizer.nextToken());
            }
        }

        while (R-- > 0) {
            int startRow = 0;
            int startCol = 0;
            int endRow = N - 1;
            int endCol = M - 1;
            int square = Math.min(N, M) / 2;

            while (square-- > 0) {
                int row0First = matrix[startRow][startCol];
                for (int i = startCol; i < endCol; i++) {
                    matrix[startRow][i] = matrix[startRow][i + 1];
                }

                for (int i = startRow; i < endRow; i++) {
                    matrix[i][endCol] = matrix[i + 1][endCol];
                }

                for (int i = endCol; i > startCol; i--) {
                    matrix[endRow][i] = matrix[endRow][i - 1];
                }

                for (int i = endRow; i > startRow + 1; i--) {
                    matrix[i][startCol] = matrix[i - 1][startCol];
                }

                matrix[startRow + 1][startCol] = row0First;

                startRow++;
                startCol++;
                endRow--;
                endCol--;
            }
        }

        for (int[] row : matrix) {
            for (int col : row) {
                sb.append(col).append(" ");
            }
            sb.append("\n");
        }

        System.out.println(sb);
    }

}
  • 벡터 버전
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tokenizer = new StringTokenizer(reader.readLine());

        int N = Integer.parseInt(tokenizer.nextToken());
        int M = Integer.parseInt(tokenizer.nextToken());
        int R = Integer.parseInt(tokenizer.nextToken());
        int[][] matrix = new int[N][M];

        int[][] directions = {
                { 1, 0 },
                { 0, 1 },
                { -1, 0 },
                { 0, -1 },
        };

        for (int i = 0; i < N; i++) {
            tokenizer = new StringTokenizer(reader.readLine());
            for (int j = 0; j < M; j++) {
                matrix[i][j] = Integer.parseInt(tokenizer.nextToken());
            }
        }

        int square = Math.min(N, M) / 2;

        while (R-- > 0) {
            for (int i = 0; i < square; i++) {
                int startRow = i;
                int startCol = i;
                int endRow = N - 1 - i;
                int endCol = M - 1 - i;

                int index = 0;

                int x = startRow;
                int y = startCol;
                int save = matrix[startRow][startCol];

                while (index < directions.length) {
                    int dx = x + directions[index][0];
                    int dy = y + directions[index][1];

                    if (dx >= startRow && dx <= endRow && dy >= startCol && dy <= endCol) {
                        int current = matrix[dx][dy];
                        matrix[dx][dy] = save;
                        save = current;
                        x = dx;
                        y = dy;
                    } else {
                        index++;
                    }
                }
            }
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                sb.append(matrix[i][j]).append(" ");
            }
            sb.append("\n");
        }
        System.out.println(sb);
    }

}

  • 벡터를 나름 이해한다 생각했으나 뒷통수를 한대 맞은 기분이다.
  • 힘들게 반복문으로 구현하였으나, 반시계 방향 벡터를 설정해두고 4방향을 모두 살피는 방식으로 진행하니 훨씬 쉬웠다.
  • 안쪽 사각형을 몇번 타야하는지 처리하는 부분이 잘 되지 않았는데, 가로와 세로 중 작은 값을 2로 나눈 값만큼 진행하면 되었다.
profile
백엔드 개발자가 되자!

0개의 댓글