[BOJ 16927] 배열 돌리기2

업데이트:

문제

  • BOJ 16927
  • 문제의 저작권은 Baekjoon Online Judge에 있습니다.

접근방식

배열돌리기1이랑 같은 문제지만 범위가 10^9까지라 그대로 코드제출하면 시간초과난다.

int num = ((N-1-(j*2))*2) +((M-1-(j*2))*2);
if(R%num != 0) num = R%num;

만약 한바퀴 도는 경우는 반복해서 수행할 필요가 없으므로 이 두 줄을 추가해주었다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

	static int N, M, R;
	static int[][] map;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken()); // 세로
		M = Integer.parseInt(st.nextToken()); // 가로
		R = Integer.parseInt(st.nextToken());

		map = new int[N][M];

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

		int cnt = Math.min(N, M) / 2; // 라인 개수

		for (int j = 0; j < cnt; j++) { //각 라인
			int num = ((N-1-(j*2))*2) +((M-1-(j*2))*2);
			if(R%num != 0) num = R%num;

			for (int i = 0; i < num; i++) {
				int tmp = map[j][j]; // 현재 라인 가장 왼쪽상단 값 임시저장

				// 반시계방향으로 한칸씩 이동(좌우상하)
				for (int k = j + 1; k < M - j; k++) {
					map[j][k - 1] = map[j][k];
				}

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

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

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

				map[j + 1][j] = tmp;
			}
		}
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				bw.write(map[i][j] + " ");
			}
			bw.newLine();
		}

		bw.flush();
		bw.close();

	}
}