-
Notifications
You must be signed in to change notification settings - Fork 2
/
김지원.java
155 lines (124 loc) · 4.53 KB
/
김지원.java
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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, map[][];
static int cleaner = -1;
static Queue<Dust> dusts;
static int[] dx = {0, -1, 0, 1}, dy = {1, 0, -1, 0};
static class Dust {
int x, y, w;
public Dust(int x, int y, int w) {
super();
this.x = x;
this.y = y;
this.w = w;
}
}
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];
// map 정보 저장
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(cleaner == -1 && map[i][j] == -1) {
cleaner = i;
}
}
}
for (int time = 0; time < T; time++) {
// 미세먼지가 있는 공간 확인
checkDust();
// 미세먼지 확산
spread();
// 공기청정기 작동
operate();
}
int res = 0;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if(map[i][j] == -1) continue;
res += map[i][j];
}
}
System.out.println(res);
}
private static void checkDust() {
dusts = new LinkedList<>();
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if(map[i][j] == -1 || map[i][j] == 0) continue;
// 미세먼지가 있는 공간과 미세먼지 양
dusts.add(new Dust(i, j, map[i][j]));
}
}
}
private static void spread() {
while(!dusts.isEmpty()) {
Dust now = dusts.poll();
// 확산될 먼지가 없으면
if(now.w < 5) continue;
// 확산되는 양은 Ar,c/5
int amountOfSpread = now.w / 5;
int cnt = 0;
// 인접한 방향으로 확산
for (int d = 0; d < 4; d++) {
int xx = now.x + dx[d];
int yy = now.y + dy[d];
// 범위를 벗어나면
if(xx < 0 || xx >= R || yy < 0 || yy >= C) continue;
// 공기청정기가 있으면
if(map[xx][yy] == -1) continue;
map[xx][yy] += amountOfSpread;
++cnt;
}
// 남은 미세먼지 양은 Ar,c - (Ar,c/5)×(확산된 방향의 개수)
map[now.x][now.y] -= amountOfSpread * cnt;
}
}
// 바람이 불면 미세먼지가 바람의 방향대로 모두 한 칸씩 이동
private static void operate() {
int top = cleaner;
int down = cleaner + 1;
// 위쪽 공기청정기의 바람은 반시계방향 순환,
// 아래로 당기기
for (int i = top - 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 < top; i++)
map[i][C - 1] = map[i + 1][C - 1];
// 오른쪽으로 당기기
for (int i = C - 1; i > 1; i--)
map[top][i] = map[top][i-1];
// 공기청정기에서 부는 바람은 미세먼지가 없는 바람
map[top][1] = 0;
// 아래쪽 공기청정기의 바람은 시계방향으로 순환
// 위로 당기기
for (int i = down + 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 > down; i--)
map[i][C - 1] = map[i - 1][C - 1];
// 오른쪽으로 당기기
for (int i = C - 1; i > 1; i--)
map[down][i] = map[down][i - 1];
// 공기청정기에서 부는 바람은 미세먼지가 없는 바람
map[down][1] = 0;
}
}