[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();
}
}