[백준] 17144번 - 미세먼지 안녕! (Gold 4)
업데이트:
문제 링크
문제 설명
방에 설치된 공기청정기의 위치와 각 지점마다 미세먼지의 양이 주어져 있다.
1초마다 아래의 일들이 순서대로 일어난다.
- 미세먼지가 확산된다.
- 미세먼지가 있는 모든 칸에서 동시에 확산이 일어난다.
- 상하좌우 네 방향으로 미세먼지가 있는 양 / 5(소수점은 버린다) 만큼이 확산된다.
- 인접한 칸에 공기청정기가 있거나 아예 칸이 없으면 그 방향으로는 확산되지 않는다.
- 공기청정기가 작동한다.
- 위쪽 공기청정기의 바람은 반시계방향으로, 아래쪽 공기청정기의 바람은 시계방향으로 순환한다.
- 바람이 불면 미세먼지는 바람의 방향대로 한칸씩 밀려난다.
- 공기청정기에서 나온 바람은 미세먼지가 없다.
- 공기청정기로 들어온 미세먼지는 정화되어 사라진다.
주어진 시간 T초가 지났을 때 방에 남아있는 미세먼지의 전체 양을 구하시오.
정답 코드 및 설명
문제에 주어진 조건을 빠짐없이 구현만 하면 된다.
아래 코드에서 각 파트를 구현한 위치는 다음과 같다.
- 공기청정기의 작동 : 90 ~ 93행
- 확산을 구현한 diffusion 메소드 : 30 ~ 47행
- 위쪽 공기청정기의 바람을 구현한 cleaningUp 메소드 : 50 ~ 64행
- 아래쪽 공기청정기의 바람을 구현한 cleaningDown 메소드 : 67 ~ 81행
가장 신경써서 구현할 부분은 공기청정기의 바람이라고 생각한다.
아래 코드에서는 공기청정기의 바람이 오른쪽으로 부는 부분, 위로 부는 부분, 왼쪽으로 부는 부분, 아래로 부는 부분을 각각 나누어서 구현하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class BOJ17144 {
static final int[][] NEXT = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int r, c, t;
int[][] dust;
ArrayList<Integer> cleanerPositions;
void input() 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());
dust = new int[r][c];
cleanerPositions = new ArrayList<>();
for (int i = 0; i < r; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < c; j++) {
dust[i][j] = Integer.parseInt(st.nextToken());
if (dust[i][j] == -1) cleanerPositions.add(i);
}
}
}
void diffusion() {
int[][] next = new int[r][c];
int nextI, nextJ;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
next[i][j] += dust[i][j];
if (dust[i][j] == -1) continue;
for (int[] ints : NEXT) {
nextI = i + ints[0];
nextJ = j + ints[1];
if (!isValid(nextI, nextJ)) continue;
if (dust[nextI][nextJ] == -1) continue;
next[nextI][nextJ] += dust[i][j] / 5;
next[i][j] -= dust[i][j] / 5;
}
}
}
dust = next;
}
void cleaningUp() {
int cleaner = cleanerPositions.get(0);
for (int i = cleaner - 1; i > 0; i--) {
dust[i][0] = dust[i - 1][0];
}
for (int j = 0; j < c - 1; j++) {
dust[0][j] = dust[0][j + 1];
}
for (int i = 0; i < cleaner; i++) {
dust[i][c - 1] = dust[i + 1][c - 1];
}
for (int j = c - 1; j > 1; j--) {
dust[cleaner][j] = dust[cleaner][j - 1];
}
dust[cleaner][1] = 0;
}
void cleaningDown() {
int cleaner = cleanerPositions.get(1);
for (int i = cleaner + 1; i < r - 1; i++) {
dust[i][0] = dust[i + 1][0];
}
for (int j = 0; j < c - 1; j++) {
dust[r - 1][j] = dust[r - 1][j + 1];
}
for (int i = r - 1; i > cleaner; i--) {
dust[i][c - 1] = dust[i - 1][c - 1];
}
for (int j = c - 1; j > 1; j--) {
dust[cleaner][j] = dust[cleaner][j - 1];
}
dust[cleaner][1] = 0;
}
boolean isValid(int i, int j) {
return i >= 0 && i < r && j >= 0 && j < c;
}
void solution() throws IOException {
input();
while (t-- > 0) {
diffusion();
cleaningUp();
cleaningDown();
}
int currDust = 2;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
currDust += dust[i][j];
}
}
System.out.println(currDust);
}
public static void main(String[] args) throws IOException {
new BOJ17144().solution();
}
}
댓글남기기