사실 그냥 구현 시뮬레이션 문제라서 별다른 접근법은 없다.
하지만, 주의해야할 점이 있다. 필자는 여기서 많이 틀렸다..
바로, 공기청정기가 바람을 쏜 위치의 시작 지점의 값을 0으로 초기화 해야 한다는 것이다.
그리고, 공기청정기가 있는 위치는 항상 -1이라는 것을 기억하며 코드를 작성해야 한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int R, C, T;
static int[][][] map;
static int airMachineFirstPosition;
static int airMachineSecondPosition;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
T = Integer.parseInt(st.nextToken());
map = new int[T + 1][R][C];
for (int i = 0; i < R; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < C; j++) {
map[0][i][j] = Integer.parseInt(st.nextToken());
}
}
boolean isAppearAirMachineFirstPosition = false;
for (int i = 0; i < R; i++) {
if (map[0][i][0] == -1) {
if (!isAppearAirMachineFirstPosition) {
airMachineFirstPosition = i;
isAppearAirMachineFirstPosition = true;
} else {
airMachineSecondPosition = i;
break;
}
}
}
for (int t = 0; t < T; t++) {
step(map[t], t);
}
int result = 0;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (map[T][i][j] > 0) {
result += map[T][i][j];
}
}
}
System.out.println(result);
}
static void step(int[][] curMap, int t) {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (curMap[i][j] > 0) {
int div = curMap[i][j] / 5;
int spreadCount = 0;
for (int k = 0; k < 4; k++) {
int nextX = i + dx[k];
int nextY = j + dy[k];
if (isIn(nextX, nextY) && curMap[nextX][nextY] >= 0) {
map[t + 1][nextX][nextY] += div;
spreadCount++;
}
}
map[t + 1][i][j] += (curMap[i][j] - div * spreadCount);
} else if (curMap[i][j] == -1) {
map[t + 1][i][j] = -1;
}
}
}
move(map[t + 1]);
}
private static void move(int[][] map) {
int previous = map[airMachineFirstPosition][1];
map[airMachineFirstPosition][1] = 0;
for (int j = 2; j < C; j++) {
int tmp = map[airMachineFirstPosition][j];
map[airMachineFirstPosition][j] = previous;
previous = tmp;
}
for (int i = airMachineFirstPosition - 1; i >= 0; i--) {
int tmp = map[i][C - 1];
map[i][C - 1] = previous;
previous = tmp;
}
for (int j = C - 2; j >= 0; j--) {
int tmp = map[0][j];
map[0][j] = previous;
previous = tmp;
}
for (int i = 1; i < airMachineFirstPosition; i++) {
int tmp = map[i][0];
map[i][0] = previous;
previous = tmp;
}
previous = map[airMachineSecondPosition][1];
map[airMachineSecondPosition][1] = 0;
for (int j = 2; j < C; j++) {
int tmp = map[airMachineSecondPosition][j];
map[airMachineSecondPosition][j] = previous;
previous = tmp;
}
for (int i = airMachineSecondPosition + 1; i < R; i++) {
int tmp = map[i][C - 1];
map[i][C - 1] = previous;
previous = tmp;
}
for (int j = C - 2; j >= 0; j--) {
int tmp = map[R - 1][j];
map[R - 1][j] = previous;
previous = tmp;
}
for (int i = R - 2; i > airMachineSecondPosition; i--) {
int tmp = map[i][0];
map[i][0] = previous;
previous = tmp;
}
}
static boolean isIn(int x, int y) {
return x >= 0 && x < R && y >= 0 && y < C;
}
}
