17144 미세먼지안녕 - 삼성 sw 역량 테스트 기출
R * C 크기의 방안에서,
-
미세먼지가 모든 칸에서 동시에 확산된다.
- 인접한 네 방향으로 확산된다.
- 인접한 칸에 공기청정기가 있거나 칸이 없으면 확산이 일어나지 않는다.
- 확산되는 양은 칸마다 (r,c)/5 이고, 소수점은 버린다.
- 남은 미세먼지 양은 (r,c) - (r,c)/5 * (확산된 방향의 개수) 이다.
-
공기청정기가 작동한다.
- 위쪽 공기청정기는 반시계방향으로 순환하고, 아래쪽은 시계방향으로 순환한다.
- 미세먼지는 바람의 방향대로 한 칸씩 이동한다.
- 공기청정기로 들어간 미세먼지는 모두 정화된다.
T초가 지난 후 방에 남아있는 미세먼지의 양은?
입력
이차원 배열에 주어진 입력 값을 입력한다.
공기청정기의 위치는 List<Integer>
에 Y좌표만 저장을 한다.
순서대로 입력을 받기 때문에 위쪽 공기청정기의 Y값은 index 0
에 저장되어있고,
X값은 index 1
에 저장되어있다.
구현
-
미세먼지의 확산을 구현한다.
- 델타 배열을 사용하여 인접한 네 방향을 방문할 수 있도록 해준다.
- 다음 미세먼지의 확산에 영향이 없도록 새로운 이차원 배열
next[][]
에 현재 칸이 확산된 결과를 더해준다.
-
공기청정기의 바람을 구현한다.
- 위쪽과 아래쪽을 따로 구현한다.
- 4개의 for문을 사용해서 방향대로 값을 당겨준다.
- 마지막에 공기청정기에서 나온 값은 0으로 설정한다.
-
main 함수에서 T초만큼 1~2를 반복한 후 map에서 0 이상인 값을 더해서 출력한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main미세먼지 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st1 = new StringTokenizer(br.readLine(), " ");
R = Integer.parseInt(st1.nextToken());
C = Integer.parseInt(st1.nextToken());
int T = Integer.parseInt(st1.nextToken());
int[][] map = new int[R][C];
List<Integer> cleaner = new ArrayList<>();
for(int i = 0; i < R; i++) {
StringTokenizer st2 = new StringTokenizer(br.readLine(), " ");
for(int j = 0; j < C; j++) {
map[i][j] = Integer.parseInt(st2.nextToken());
if(map[i][j]==-1) {
cleaner.add(i);
}
}
}
while(T > 0) {
int[][] next = new int[R][C];
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
if (map[i][j]>0) {
spread(i, j, map, next);
}
}
}
next[cleaner.get(0)][0] = -1;
next[cleaner.get(1)][0] = -1;
map = next;
cleanTop(cleaner.get(0), map);
cleanBottom(cleaner.get(1), map);
T--;
}
System.out.println(check(map));
}
static int[] dy = {1,-1,0,0};
static int[] dx = {0,0,-1,1};
static int R;
static int C;
static void spread(int y, int x, int[][] map, int[][] next) {
int cnt = 0;
for(int i = 0; i < 4; i++) {
int yi = y + dy[i];
int xi = x + dx[i];
if(yi < 0 || xi < 0 || yi >= R || xi >= C || map[yi][xi] == -1)continue;
next[yi][xi] += map[y][x]/5;
cnt++;
}
next[y][x]+=map[y][x] - map[y][x]/5 * cnt;
}
static void cleanTop(int y, int[][] map) {
for(int i = y-1; i > 0; i--) {
map[i][0] = map[i-1][0];
}
for(int i = 0; i < C-1; i++) {
map[0][i] = map[0][i+1];
}
for(int i = 0; i < y; i++) {
map[i][C-1] = map[i+1][C-1];
}
for(int i = C-1; i > 1; i--) {
map[y][i] = map[y][i-1];
}
map[y][1] = 0;
}
static void cleanBottom(int y, int[][] map) {
for(int i = y+1; 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 > y; i--) {
map[i][C-1] = map[i-1][C-1];
}
for(int i = C-1; i > 1; i--) {
map[y][i] = map[y][i-1];
}
map[y][1] = 0;
}
static int check(int[][] map) {
int sum = 0;
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
if(map[i][j] > 0) {
sum+=map[i][j];
}
}
}
return sum;
}
}