풀이 방법
- 적혀있는 대로 구현하면 돼서 비교적 쉬운 문제였다.
- 미세먼지 확장 : 모든 곳 방문하면서 인접한 곳에 a//5더해주고, a-(a//5)*cnt 해주는 함수 만들기 = diffusion
- 공기 청정기 작동 : 공기청정기 위에서 시작해서 반시계 방향순환, 아래에서 시작해서 반시계 방향순환 = clean
전체 코드
r, c, t = map(int, input().split())
room = []
for i in range(r):
room.append(list(map(int, input().split())))
cleaner = []
for i in range(r):
for j in range(c):
if room[i][j] == -1:
cleaner.append((i, j))
def diffusion():
global room, cleaner
temp = [[0]*c for _ in range(r)]
move = [(0,1),(0,-1),(1,0),(-1,0)]
for i in range(r):
for j in range(c):
if room[i][j]==0 or room[i][j]==-1: continue
cnt = 0
for x, y in move:
cx = i+x
cy = j+y
if 0<=cx<r and 0<=cy<c and room[cx][cy]!= -1:
temp[cx][cy] += room[i][j]//5
cnt += 1
temp[i][j] += room[i][j]-cnt*(room[i][j]//5)
temp[cleaner[0][0]][cleaner[0][1]] = -1
temp[cleaner[1][0]][cleaner[1][1]] = -1
room = temp
def clean(x, y, move):
last = 0
j = 0
start = (x, y)
x += move[0][0]
y += move[0][1]
while x != start[0] or y != start[1]:
next = room[x][y]
room[x][y] = last
last = next
x += move[j][0]
y += move[j][1]
if not (0<=x<r and 0<=y<c):
if j == 3: break
x = x - move[j][0] + move[j+1][0]
y = y - move[j][1] + move[j+1][1]
j += 1
for _ in range(t):
diffusion()
clean(cleaner[0][0], cleaner[0][1], [(0, 1), (-1, 0), (0, -1), (1, 0)])
clean(cleaner[1][0], cleaner[1][1], [(0, 1), (1, 0), (0, -1), (-1, 0)])
answer = 0
for i in range(r):
for j in range(c):
if room[i][j] and room[i][j] != -1:
answer+= room[i][j]
print(answer)
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[Python] 백준 17142 : 연구소 3 (0) | 2021.04.15 |
---|---|
[Python] 백준 17143 : 낚시왕 (0) | 2021.04.14 |
[Python] 백준 16236 : 아기 상어 (0) | 2021.04.10 |
[Python] 백준 16235 : 나무 재테크 (0) | 2021.04.08 |
[Python] 백준 16234 : 인구 이동 (0) | 2021.04.06 |