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

 

16927번: 배열 돌리기 2

크기가 N×M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] ← A[1][2] ← A[1][3] ← A[1][4] ← A[1][5] ↓ ↑ A[2][1] A[2][2] ← A[2][3] ← A[2][4] A[2][5]

www.acmicpc.net

흠 조금 시간이 걸렸네요 

키포인트는 

명령횟수가  10^9이어서 시간초과가 발생합니다. 그래서 회전의 경우 원복되는 상황은 그대로인걸 감안해서 %를 이용해서 횟수를 줄이면됩니다.

키포인트:

  int parms = (2 * (n - 2 * i) + 2 * (m - 2 * i) - 4);
            int rotations = k % parms;
package test01;
import java.util.*;
import java.lang.*;
import java.io.*;

public class Main {
    public static int[][] maps;
    public static int[][] copymaps;
    public static int n, m, k;

    public static void prtints(int[][] maps, int n, int m) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(maps[i][j] + " ");
            }
            System.out.println();
        }
    }

    public static void rotation(int startr, int endr, int startc, int endc) {
        // top
        for (int i = startc + 1; i <= endc; i++) {
            copymaps[startr][i - 1] = maps[startr][i];
        }
        // left
        for (int i = startr; i < endr; i++) {
            copymaps[i + 1][startc] = maps[i][startc];
        }
        // right
        for (int i = startr + 1; i <= endr; i++) {
            copymaps[i - 1][endc] = maps[i][endc];
        }
        // bottom
        for (int i = startc; i < endc; i++) {
            copymaps[endr][i + 1] = maps[endr][i];
        }
       
        for (int i = startr; i <= endr; i++) {
            for (int j = startc; j <= endc; j++) {
                maps[i][j] = copymaps[i][j];
            }
        }
    }

    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        m = scan.nextInt();
        k = scan.nextInt();
        maps = new int[n][m];
        copymaps = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int tmp = scan.nextInt();
                maps[i][j] = tmp;
                copymaps[i][j] = tmp;
            }
        }

        int ci = Math.min(n, m) / 2;

        for (int i = 0; i < ci; i++) {
            int parms = (2 * (n - 2 * i) + 2 * (m - 2 * i) - 4);
            int rotations = k % parms;
            for (int t = 0; t < rotations; t++) {
                rotation(i, n - 1 - i, i, m - 1 - i);
            }
        }

        prtints(maps, n, m);
    }
}

'알고리즘 공부' 카테고리의 다른 글

백준 마법사 상어와 토네이도  (0) 2024.04.02
백준 최소 회의실 개수  (0) 2024.04.02
백준 0 만들기  (1) 2024.04.01
백준 로봇 시뮬레이션  (1) 2024.04.01
백준 -탑  (0) 2024.03.30

+ Recent posts