IT 개발 관련/[Algorithm]

[백준] 16926번 : 배열 돌리기 1 - Java

Baileyton 2024. 8. 1. 17:15
728x90

문제

https://www.acmicpc.net/problem/16926

주어진 N x M 크기의 2차원 배열과 정수 R이 주어집니다. 배열의 각 층을 시계 방향으로 R번 회전시키는 문제입니다. 배열의 크기와 회전 횟수에 따라 각 층이 어떻게 변하는지 구현하는 문제입니다.

접근 방법

  1. 층 분리:
    • 배열을 층별로 나누어 각 층을 별도로 다룹니다. 각 층은 외부에서 내부로 원형으로 구성된 요소들의 집합입니다.
  2. 회전 처리:
    • 각 층을 회전시키기 위해, 우선 각 층을 1차원 배열로 변환한 뒤 회전한 후, 다시 2차원 배열로 복원합니다.
  3. 출력:
    • 변환된 배열을 출력합니다.

해결 방법

  1. 층 분리:
    • 각 층의 시작과 끝 좌표를 정의하고, 해당 좌표에 위치한 요소들을 1차원 배열로 변환합니다.
  2. 회전 처리:
    • 1차원 배열로 변환된 층을 시계 방향으로 회전합니다. 회전은 배열의 인덱스를 계산하여 처리합니다.
  3. 복원:
    • 회전된 1차원 배열을 다시 2차원 배열의 해당 층에 배치합니다.

코드

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 {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int R = Integer.parseInt(st.nextToken());

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

        for(int i=0; i<R; i++) {

            for(int j=0; j< Math.min(N, M)/2; j++) {

                int temp = array[j][j];

                for(int k=j; k<M-j-1; k++) {
                    array[j][k] = array[j][k+1];
                }

                for(int k=j; k<N-1-j; k++) {
                    array[k][M-j-1] = array[k+1][M-j-1];
                }

                for(int k=M-j-1; k>j; k--) {
                    array[N-1-j][k] = array[N-1-j][k-1];
                }

                for(int k=N-j-1; k>j; k--) {
                    array[k][j] = array[k-1][j];
                }
                array[j+1][j] = temp;
            }
        }


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

 

메모리:31716kb 시간:684ms

728x90