[실수 코드]
import java.util.*;
import java.io.*;
public class Main {
static int N, M, T;
static int[] x, d, k;
static int[][] board, board2;
static List<Integer> numList = new ArrayList<Integer>();
static int solution;
public static void print2D(int[][] array) {
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
public static int sum2D(int[][] array) {
int summation=0;
for(int i=0; i<N;i++) {
for(int j=0; j<M; j++) {
summation += array[i][j];
}
}
return summation;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
T = sc.nextInt();
board = new int[N][M];
board2 = new int[N][N];
for(int i =0; i<N; i++) {
for(int j=0; j<M; j++) {
board[i][j] = sc.nextInt();
board2[i][j] = board[i][j];
}
}
//이걸 빼먹음
x = new int[T];
d = new int[T];
k = new int[T];
for(int t=0; t<T; t++) {
x[t] = sc.nextInt();
d[t] = sc.nextInt();
k[t] = sc.nextInt();
}
//scanner는 닫아준다
sc.close();
solution();
}
public static void solution() {
for(int t=0; t<T; t++) {
//돌릴 판 index구하기
getNumList(x[t]);
//List에서 모두 1을 빼는 방법이 있을까?
//System.out.println(numList);
//원판 돌리기
rotation(d[t], k[t]);
//인접한 숫자들 제거 (제거여부 true, false 반환)
boolean adYn = adjacent();
if(adYn == true) {
//인접한게 있으면 지워진거에서 모두 합
print2D(board2);
System.out.println();
}else if(adYn == false) {
System.out.println("no");
noAdjacent();
print2D(board2);
System.out.println();
}
//초기화 및 update
copy2D(board2, board);
numList = new ArrayList<Integer>();
}
//solution 출력
solution = sum2D(board2);
System.out.println(solution);
}
public static void noAdjacent() {
//인접한게 없으면 평균내고 평균보다 큰 수는 -1 작은수는 +1을 더하고나서 합
//0 이 제거된것을 내가 빼먹고 계속 +1, -1해주고 있었음
float summ = sum2D(board2);
//0을 제외한것을 count해줘야 한다.
int nums = countExceptZero(board2);
float avg = summ/(float) nums;
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(board2[i][j]>avg && board2[i][j] !=0) {
board2[i][j] -= 1;
}else if(board2[i][j] < avg && board2[i][j] !=0) {
board2[i][j] += 1;
}
}
}
}
public static int countExceptZero(int[][] board) {
int count=0;
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(board[i][j] !=0) {
count +=1;
}
}
}
return count;
}
public static boolean adjacent() {
boolean adYn = false;
//북남서동
int[] dx = {-1,1,0,0};
int[] dy = {0,0,-1,1};
//하나씩보면서 동서남북 주변에 같은 숫자가 있는지 확인
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
//범위만 넘어가지 않으면 (4방향)
for(int dir=0; dir<4; dir++) {
int new_x = i+dx[dir];
int new_y = j+dy[dir];
//이 조건이 아니라
if(new_x>=0 && new_x<N) {
if(new_y>=0 && new_y<M) {
//만약 같으면
if(board[new_x][new_y] == board[i][j] && board[i][j] !=0) {
board2[new_x][new_y] = 0;
adYn = true;
}
}
}
}
}
}
return adYn;
}
public static void rotation(int d, int k) {
//시계방향인지 아닌지 판단
int dir=0;
if(d==1) {
dir = 1;
}else if(d==0) {
dir = -1;
}
//해당 원판을 k번만큼 돌린다.
for(int l=0; l<k; l++) {
for(int i=0; i<N; i++) {
if(numList.contains(i)) {
for(int j=0; j<M; j++) {
board2[i][j] = board[i][(j+dir+M)%M];
//board[i][j] = board2[i][j]; //나중에 두 개로 관리할거임
}
}
}
copy2D(board2, board);
}
}
public static void copy2D(int[][] boardSrc, int[][] boardTarget) {
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
boardTarget[i][j] = boardSrc[i][j];
}
}
}
public static void getNumList(int x){
int i=1;
int x_new = 0;
//몇 번째 판을 돌릴지 index를 구하는 것
while(true) {
x_new = x*i;
if(x_new>N+1) {
break;
}
numList.add(x_new-1);
i+=1;
}
return;
}
}
periodic condition으로 했어야 했는데, 내가 그냥 막아버렸다 그래서 예제 출려4번에서 틀림