BOJ 17144 미세먼지 안녕!
메모리 : 146176 KB
시간 : 428 ms
BOJ 17144 미세먼지 안녕!
풀이
간단한 구현 문제였다.
매번 하던대로 큐 돌린 다음에 바로 큐에 넣었더니 답이 이상하게 나왔다.
당연했다.. 미세먼지 확산 후에 공기청정기가 돌아가기 때문에 공기청정기가 돌아간 뒤에 미세먼지 위치를 파악해서 큐에 넣어줬어야 했다..
정신 차리길..!^^
느낀점
익숙함에 속지말자!
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int R, C, T;
static int[][] map;
static Queue<Pos> q;
static int[][] airCleaner;
static int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
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());
T = Integer.parseInt(st.nextToken());
map = new int[R][C];
q = new LinkedList<>();
airCleaner = new int[2][2];
int airIndex = 0;
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] > 0) {
q.offer(new Pos(i, j));
} else if (map[i][j] == -1) {
airCleaner[airIndex][0] = i;
airCleaner[airIndex][1] = j;
airIndex++;
}
}
}
for (int t = 0; t < T; t++) {
// 1. 미세먼지 확산
spread();
// 2. 공기청정기 작동
airClean();
}
int ans = 0;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (map[i][j] <= 0) continue;
ans += map[i][j];
}
}
System.out.println(ans);
}
public static void spread() {
int[][] copy = new int[R][C];
copy[airCleaner[0][0]][airCleaner[0][1]] = -1;
copy[airCleaner[1][0]][airCleaner[1][1]] = -1;
while(!q.isEmpty()) {
int cnt = 0; // 확산된 구역 개수
Pos cur = q.poll();
int mise = map[cur.x][cur.y];
for (int i = 0; i < 4; i++) {
int nx = cur.x + dir[i][0];
int ny = cur.y + dir[i][1];
if (nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
if (map[nx][ny] == -1) continue;
cnt++;
copy[nx][ny] += (mise / 5);
}
copy[cur.x][cur.y] += mise - ((mise / 5) * cnt);
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
map[i][j] = copy[i][j];
}
}
}
public static void airClean() {
// 공기 청정기 위쪽
int x = airCleaner[0][0];
int y = airCleaner[0][1];
for (int i = x-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 < x; i++) {
map[i][C-1] = map[i+1][C-1];
}
for (int i = C-1; i > 1 ; i--) {
map[x][i] = map[x][i-1];
}
map[x][1] = 0;
// 공기 청정기 아래쪽
x = airCleaner[1][0];
y = airCleaner[1][1];
for (int i = x+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 > x ; i--) {
map[i][C-1] = map[i-1][C-1];
}
for (int i = C-1; i > y ; i--) {
map[x][i] = map[x][i-1];
}
map[x][1] = 0;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (map[i][j] > 0) q.offer(new Pos(i, j));
}
}
}
static class Pos {
int x;
int y;
public Pos(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
}