1R, C, T = map(int, input().split())
2L = [list(map(int, input().split())) for _ in range(R)]
3
4dx = [0, 1, 0, -1]
5dy = [-1, 0, 1, 0]
6dx2 = [0, 1, 0, -1]
7dy2 = [1, 0, -1, 0]
8
9pur_a = (0, 0)
10pur_b = (0, 0)
11
12for i in range(R):
13 if L[i][0] == -1:
14 pur_a = (i, 0)
15 pur_b = (i+1, 0)
16 break
17
18def diffuse(L):
19 L_ = [[0]*C for _ in range(R)]
20
21 for i in range(R):
22 for j in range(C):
23 if L[i][j] > 0:
24 cnt = 0
25 for k in range(4):
26 px = j+dx[k]
27 py = i+dy[k]
28
29 if 0 <= px < C and 0 <= py < R and L[py][px] != -1:
30 L_[py][px] += L[i][j] // 5
31 cnt += 1
32 L_[i][j] += L[i][j] - ((L[i][j] // 5)*cnt)
33
34 return L_
35
36def air_purify(L):
37 x = pur_a[1]
38 y = pur_a[0]
39 lastX = 0
40 lastY = 0
41 i = 0
42 while i < 4:
43 lastX = x
44 lastY = y
45 x += dx[i]
46 y += dy[i]
47
48 if not (0 <= x < C and 0 <= y < R) or (x, y) == (C-1, pur_a[0]+1):
49 x -= dx[i]
50 y -= dy[i]
51 lastX = x
52 lastY = y
53 i += 1
54 continue
55 if (x, y) == (pur_a[1], pur_a[0]):
56 L[pur_a[0]][pur_a[1]+1] = 0
57 L[pur_a[0]][pur_a[1]] = -1
58 break
59 L[lastY][lastX] = L[y][x]
60
61 x = pur_b[1]
62 y = pur_b[0]
63 i = 0
64 while i < 4:
65 lastX = x
66 lastY = y
67 x += dx2[i]
68 y += dy2[i]
69
70 if not (0 <= x < C and 0 <= y < R) or (x, y) == (C-1, pur_b[0]-1):
71 x -= dx2[i]
72 y -= dy2[i]
73 lastX = x
74 lastY = y
75 i += 1
76 continue
77 if (x, y) == (pur_b[1], pur_b[0]):
78 L[pur_b[0]][pur_b[1]+1] = 0
79 L[pur_b[0]][pur_b[1]] = -1
80 break
81 L[lastY][lastX] = L[y][x]
82
83for i in range(T):
84 L = diffuse(L)
85 air_purify(L)
86
87result = 0
88for i in L:
89 for j in i:
90 if j != -1:
91 result += j
92print (result)
고찰
- 구현/시뮬레이션 문제이다
- 혼자 풀긴했다
- 구현 문제는 항상 푸는데 시간이 오래걸린다는 생각이 든다
시간을 잡아먹었던 부분
- 미세먼지가 확산되는 부분
- 인접한 두 곳에 미세먼지가 존재할때 중복되는 것에 대한 처리를 어떻게 해야할지 고민했다
- 새로운 배열에 더하는 방식으로 해결했다
- 공기청정기로부터 바람이 시계방향, 반시계방향으로 도는 것에 대한 부분
- lastX, lastY라는 변수를 만들어 이전에 있었던 인덱스를 저장한뒤 현재 값을 이전의 공간에 대입한다
- 이를 위해 순회를 반대방향으로 해야한다 (시계->반시계, 반시계->시계)