반응형
이 문제는 조건에 따라서 미세먼지를 확산시킨 후 공기청정기를 작동시키는 문제입니다.
저는 이 문제를 확산시키는 함수와 공기청정기에 의해서 미세먼지들이 이동하는 함수로 나누어 풀었습니다.
우선 확산시키는 함수는 map배열을 검사하며 미세먼지의 농도가 5 이상일 때만 ArraList에 입력했습니다.
그 후 ArrayList에 있는 데이터들을 꺼내서 그 주변으로 확산시켰습니다.
미세먼지의 농도가 5 이상일 때 바로 확산시키지 않은 이유는 바로 확산시킨다면 확산된 미세먼지가 주변에 영향을 주어서
제대로 정답을 구하기 어렵기 때문입니다.
그 후 미세먼지들을 이동시키는 함수를 실행시켰습니다.
코드를 보면 이해하실 수 있으실 겁니다.
import java.util.*;
import java.io.*;
public class Main {
static int[][] map;
static int R, C;
static int[] dRow = {1, -1, 0, 0};
static int[] dCol = {0, 0, 1, -1};
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];
int cleanR = -1;
for(int i = 0; i<R; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0; j<C; j++) {
int a = Integer.parseInt(st.nextToken());
map[i][j] = a;
if(a == -1 && cleanR == -1)
cleanR = i;
}
}
while(T-->0){
spread();
move(cleanR);
}
int sum = 0;
for(int i = 0; i<R; i++)
for (int j = 0; j < C; j++)
sum += map[i][j];
System.out.println(sum+2);
}
//미세먼지 확산
static void spread(){
List<Data> l = new ArrayList<>();
for(int i = 0; i<R; i++)
for(int j = 0; j<C; j++)
if(map[i][j]>=5)
l.add(new Data(i, j, map[i][j]));
for (Data data : l) {
int count = 0;
int r = data.row;
int c = data.col;
int v = data.val;
for (int j = 0; j < 4; j++) {
int dr = r + dRow[j];
int dc = c + dCol[j];
if (dr < 0 || dc < 0 || dr >= R || dc >= C)
continue;
if (map[dr][dc] == -1)
continue;
map[dr][dc] += v / 5;
count++;
}
map[r][c] -= v / 5 * count;
}
}
//공기청정기 가동
static void move(int cleanR){
for(int i = cleanR-2; i>=0; i--)
map[i+1][0] = map[i][0];
for(int i = 0; i<C-1; i++)
map[0][i] = map[0][i+1];
for(int i = 0; i<cleanR; i++)
map[i][C-1] = map[i+1][C-1];
for(int i = C-1; i>1; i--)
map[cleanR][i] = map[cleanR][i-1];
map[cleanR][1] = 0;
for(int i = cleanR+2; i<R-1; i++)
map[i][0] = map[i+1][0];
for(int i = 0; i<C-1; i++)
map[R-1][i] = map[R-1][i+1];
for(int i = R-1; i>cleanR+1; i--)
map[i][C-1] = map[i-1][C-1];
for(int i = C-1; i>1; i--)
map[cleanR+1][i] = map[cleanR+1][i-1];
map[cleanR+1][1] = 0;
}
}
class Data{
int row, col, val;
Data(int row, int col, int val){
this.row = row;
this.col = col;
this.val = val;
}
}
반응형
'알고리즘 > 구현' 카테고리의 다른 글
백준 13335번 : 트럭 java (0) | 2022.06.16 |
---|---|
백준 14503번 : 로봇 청소기 java (0) | 2022.06.16 |
백준 1138번 : 한 줄로 서기 java (0) | 2022.06.07 |
백준 14500번 : 테트로미노 java (0) | 2022.05.25 |
백준 11729번 : 하노이 탑 이동 순서 java (0) | 2022.05.24 |
댓글