배열 돌리기 1 16926

LJM·2023년 7월 14일
0

백준풀기

목록 보기
177/259

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

그냥 for문으로 일일이 swap 처리하면 시간초과 날거 같아서
매트릭스를 바깥쪽 부터 한 겹씩 라인이라고 생각하고 따로 저장하고 회전했을때의 시작위치를 찾아주고
라인의 시작위치부터 다시 한 겹씩 매트릭스로 만들어 주었다

import java.io.*;
import java.util.*;


public class Main {

    public static void main(String[] args)throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(" ");
        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);
        int r = Integer.parseInt(input[2]);

        int[][] mat = new int[n][m];

        for (int i = 0; i < n; i++) {
            input = br.readLine().split(" ");
            for (int j = 0; j < m; j++) {
                mat[i][j] = Integer.parseInt(input[j]);
            }
        }

        //작은것을 2로 나누면 필요한 선 개수를 구한다
        int piece = Math.min(n, m)/2;

        ArrayList<ArrayList<Integer>> lines = new ArrayList<>();
        for (int i = 0; i < piece; i++) {
            lines.add(new ArrayList<>());
        }

        int row = 0;
        int col = 0;
        for (int i = 0; i < piece; i++) {

            for (int j = i; j < m-i; j++) {
                col = j;
                lines.get(i).add(mat[row][col]);
            }

            for (int j = i+1; j < n-i; j++) {
                row = j;
                lines.get(i).add(mat[row][col]);
            }

            for (int j = m-2-i; j >= i; j--) {
                col = j;
                lines.get(i).add(mat[row][col]);
            }

            for (int j = n-2-i; j > i; j--) {
                row = j;
                lines.get(i).add(mat[row][col]);
            }

            row = i+1;
            col = i+1;
        }


        row = 0;
        col = 0;
        int[][] mats = new int[n][m];
        for (int i = 0; i < piece; i++) {

            ArrayList<Integer> cur = lines.get(i);
            int start = r % cur.size();

            for (int j = i; j < m-i; j++) {
                col = j;
                mats[row][col] = cur.get(start++);

                if(start >= cur.size())
                    start = 0;
            }


            for (int j = i+1; j < n-i; j++) {
                row = j;
                mats[row][col] = cur.get(start++);

                if(start >= cur.size())
                    start = 0;
            }

            for (int j = m-2-i; j >= i; j--) {
                col = j;
                mats[row][col] = cur.get(start++);

                if(start >= cur.size())
                    start = 0;
            }

            for (int j = n-2-i; j > i; j--) {
                row = j;
                mats[row][col] = cur.get(start++);

                if(start >= cur.size())
                    start = 0;
            }

            row = i+1;
            col = i+1;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int cur = mats[i][j];
                if(j == m-1){
                    sb.append(cur + "\n");
                }else
                    sb.append(cur + " ");
            }
        }

        System.out.println(sb.toString());
    }
}
profile
게임개발자 백엔드개발자

0개의 댓글