https://www.acmicpc.net/problem/17822
반지름이 1, 2, ..., N인 원판이 크기가 작아지는 순으로 바닥에 놓여있고, 원판의 중심은 모두 같다. 원판의 반지름이 i이면, 그 원판을 i번째 원판이라고 한다. 각각의 원판에는 M개의 정수가 적혀있고, i번째 원판에 적힌 j번째 수의 위치는 (i, j)로 표현한다. 수의 위치는 다음을 만족한다.
아래 그림은 N = 3, M = 4인 경우이다.
원판의 회전은 독립적으로 이루어진다. 2번 원판을 회전했을 때, 나머지 원판은 회전하지 않는다. 원판을 회전시킬 때는 수의 위치를 기준으로 하며, 회전시킨 후의 수의 위치는 회전시키기 전과 일치해야 한다.
다음 그림은 원판을 회전시킨 예시이다.
1번 원판을 시계 방향으로 1칸 회전 | 2, 3번 원판을 반시계 방향으로 3칸 회전 | 1, 3번 원판을 시계 방향으로 2칸 회전 |
원판을 아래와 같은 방법으로 총 T번 회전시키려고 한다. 원판의 회전 방법은 미리 정해져 있고, i번째 회전할때 사용하는 변수는 xi, di, ki이다.
원판을 T번 회전시킨 후 원판에 적힌 수의 합을 구해보자.
첫째 줄에 N, M, T이 주어진다.
둘째 줄부터 N개의 줄에 원판에 적힌 수가 주어진다. i번째 줄의 j번째 수는 (i, j)에 적힌 수를 의미한다.
다음 T개의 줄에 xi, di, ki가 주어진다.
원판을 T번 회전시킨 후 원판에 적힌 수의 합을 출력한다.
4 4 1
1 1 2 3
5 2 4 2
3 1 3 5
2 1 3 2
2 0 1
30
4 4 2
1 1 2 3
5 2 4 2
3 1 3 5
2 1 3 2
2 0 1
3 1 3
22
4 4 3
1 1 2 3
5 2 4 2
3 1 3 5
2 1 3 2
2 0 1
3 1 3
2 0 2
22
4 4 4
1 1 2 3
5 2 4 2
3 1 3 5
2 1 3 2
2 0 1
3 1 3
2 0 2
3 1 1
0
4 6 3
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7 8
4 5 6 7 8 9
2 1 4
3 0 1
2 1 2
26
이 문제는 문제에 주어진 조건을 정확하게 읽었다면 쉽게 풀 수 .
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static int[][] map;
static int N;
static int M;
static int sum = 0;
static int cnt = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
N = Integer.parseInt(str[0]);
M = Integer.parseInt(str[1]);
int T = Integer.parseInt(str[2]);
map = new int[N+1][M+1];
for(int i=1; i<=N; i++) {
String[] input = br.readLine().split(" ");
for(int j=1; j<=M; j++)
map[i][j] = Integer.parseInt(input[j-1]);
}
for(int i=0; i<T; i++) {
String[] input2 = br.readLine().split(" ");
turn(Integer.parseInt(input2[0]), Integer.parseInt(input2[1]), Integer.parseInt(input2[2]));
/*for(int k=1; k<=N; k++) {
for(int j=1; j<=M; j++)
System.out.print(map[k][j]);
System.out.println();
}*/
boolean flag = delete();
if(!flag) {
plus_minus();
}
}
/*for(int i=1; i<=N; i++) {
for(int j=1; j<=M; j++)
System.out.print(map[i][j]);
System.out.println();
}*/
System.out.println(sum);
}
static void plus_minus() {
double aver = (double)sum/cnt;
for(int i=1; i<=N; i++) {
for(int j=1; j<=M; j++) {
if(map[i][j]!=0) {
if(map[i][j]>aver) {
map[i][j]--;
sum--;
}
else if(map[i][j]<aver) {
map[i][j]++;
sum++;
}
}
}
}
}
static boolean delete() {
boolean flag = false;
boolean[][] f_map = new boolean[N+1][M+1];
for(int i=1; i<=N; i++) {
for(int j=1; j<=M; j++) {
if(map[i][j]==0)
continue;
for(int k=0; k<4; k++) {
int nx = i+dx[k];
int ny = j+dy[k];
if(nx>=1 && nx<=N && ny>=1 && ny <=M && map[i][j]==map[nx][ny]) {
f_map[nx][ny] = true;
f_map[i][j] = true;
flag = true;
//map[nx][ny] = 0;
}
}
if(j==1) {
if(map[i][j]==map[i][M]) {
f_map[i][M] = true;
f_map[i][j] = true;
}
}
}
}
int s = 0;
int c = 0;
for(int i=1; i<=N; i++) {
for(int j=1; j<=M; j++) {
if(f_map[i][j])
map[i][j] = 0;
if(map[i][j]!=0)
c++;
s+=map[i][j];
}
}
sum = s;
cnt = c;
return flag;
}
static void turn(int x, int d, int k) {
if(d==0) {
for(int i=1; i<=N; i++) {
if(i%x==0) {
for(int l=0; l<k%M; l++) {
int p = map[i][M];
for(int j=M; j>1; j--) {
map[i][j] = map[i][j-1];
}
map[i][1] = p;
}
}
}
}
else {
for(int i=1; i<=N; i++) {
if(i%x==0) {
for(int l=0; l<k%M; l++) {
int p = map[i][1];
for(int j=1; j<M; j++) {
map[i][j] = map[i][j+1];
}
map[i][M] = p;
}
}
}
}
}
}