미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다.
공기청정기는 항상 1번 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼지가 있고, (r, c)에 있는 미세먼지의 양은 Ar,c이다.
1초 동안 아래 적힌 일이 순서대로 일어난다.
공기청정기의 바람은 다음과 같은 방향으로 순환한다.
방의 정보가 주어졌을 때, T초가 지난 후 구사과의 방에 남아있는 미세먼지의 양을 구해보자.
첫째 줄에 R, C, T (6 ≤ R, C ≤ 50, 1 ≤ T ≤ 1,000) 가 주어진다.
둘째 줄부터 R개의 줄에 Ar,c (-1 ≤ Ar,c ≤ 1,000)가 주어진다. 공기청정기가 설치된 곳은 Ar,c가 -1이고, 나머지 값은 미세먼지의 양이다. -1은 2번 위아래로 붙어져 있고, 가장 윗 행, 아랫 행과 두 칸이상 떨어져 있다.
한 줄에 x1, y1, r1, x2, y2, r2가 주어진다. x1, y1, x2, y2는 -10,000보다 크거나 같고, 10,000보다 작거나 같은 정수이고, r1, r2는 10,000보다 작거나 같은 자연수이다.
첫째 줄에 T초가 지난 후 구사과 방에 남아있는 미세먼지의 양을 출력한다.
2차원 배열 회전, 4방 탐색 문제
:exclamation: 확산은 동시에 모든 먼지에서 일어난다.
1행부터 차례대로가 아님
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
//17144 미세먼지 안녕! -> 4방 탐색
public class Main_B17144 {
static int r,c,map[][],airX1,airX2;
static void diffuse() {
int[]dx = {0,-1,0,1};
int[]dy = {1,0,-1,0};
//동시에 확산이 이뤄져야 하므로 temp배열에 각 위치의 증가 값만 따로 저장
int[][]temp=new int[r][c];
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if(map[i][j]==-1)continue;
int cnt = 0;
for(int k=0;k<4;k++) {
int nx = i+dx[k];
int ny = j+dy[k];
if(nx>=0&&nx<r&&ny>=0&&ny<c&&map[nx][ny]!=-1){
//각 위치의 증가값 저장
temp[nx][ny]+=Math.floor(map[i][j]/5);
cnt++;
}
}
//본 배열에서 확산된 미세먼지를 감소시켜줌
map[i][j]-=Math.floor(map[i][j]/5)*cnt;
}
}
//증가 값과 감소된 본 배열을 더해줌
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
map[i][j]+=temp[i][j];
}
}
}
//회전
static void rotate(int[]dx,int[]dy,int airX) {
int index = 0;
int x=airX,y=0,temp,save=map[x][y],nx,ny;
while(index<4) {
nx=x+dx[index];
ny=y+dy[index];
if(nx>=0&&nx<r&&ny>=0&&ny<c&&map[nx][ny]!=-1) {
temp=map[nx][ny];
map[nx][ny]=save;
save=temp;
x=nx;
y=ny;
}
else index++;
}
if(map[airX][1]==-1)map[airX][1]=0;
}
static int getCount() {
int a=0;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if(map[i][j]==-1)continue;
a+=map[i][j];
}
}
return a;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
int T = Integer.parseInt(st.nextToken());
map = new int[r][c];
for (int i = 0; i < r; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < c; j++) {
map[i][j]=Integer.parseInt(st.nextToken());
if(map[i][j]==-1) {
//공기 청정기 위치 저장
if(airX1==0)airX1=i;
else airX2=i;
}
}
}
int[]tdx = {0,-1,0,1};
int[]tdy = {1,0,-1,0};
int[]bdx = {0,1,0,-1};
int[]bdy = {1,0,-1,0};
for (int i = 0; i < T; i++) {
//확산
diffuse();
//반시계방향
rotate(tdx,tdy,airX1);
//시계방향
rotate(bdx,bdy,airX2);
}
System.out.println(getCount());
}
}