해야만 한다
[Python] 백준 17144. 미세먼지 안녕! 본문
https://www.acmicpc.net/problem/17144
풀이
클리너의 위치를 저장하고(반드시 0열이므로 행만 찾으면 된다)
확산, 클리닝 함수를 작성해서
모든 방향 for문으로 index 조절해서 이동시키고 확산시켰다.
주의점은 먼지가 확산하는 과정에서 각 위치에서의 먼지의 양이 달라지므로
먼지들의 좌표를 저장할 때 확산시킬 먼지의 양을 같이 저장해두어야 한다는 점
코드
import sys
input = sys.stdin.readline
r,c,t = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(r)]
cleaner = []
for i in range(r):
if arr[i][0] == -1:
cleaner.append(i)
top_cleaner = cleaner[0]
bot_cleaner = cleaner[1]
def spread():
spread_ls = []
for i in range(r):
for j in range(c):
if arr[i][j] >= 5:
spread_ls.append((i,j,arr[i][j]//5))
for i in spread_ls:
dust = i[2]
for k in [0,1],[1,0],[0,-1],[-1,0]:
ni = i[0] + k[0]
nj = i[1] + k[1]
if 0 <= ni < r and 0 <= nj < c and arr[ni][nj] != -1:
arr[ni][nj] += dust
arr[i[0]][i[1]] -= dust
def top_cleaning():
for i in range(top_cleaner-1, -1, -1):
if arr[i+1][0] != -1:
arr[i+1][0] = arr[i][0]
else:
arr[i][0] = 0
for j in range(1, c):
arr[0][j-1] = arr[0][j]
for i in range(1, top_cleaner+1):
arr[i-1][c-1] = arr[i][c-1]
for j in range(c-2, 0, -1):
arr[top_cleaner][j+1] = arr[top_cleaner][j]
arr[top_cleaner][1] = 0
def bot_cleaning():
for i in range(bot_cleaner+1, r):
if arr[i-1][0] != -1:
arr[i-1][0] = arr[i][0]
else:
arr[i][0] = 0
for j in range(1, c):
arr[r-1][j-1] = arr[r-1][j]
for i in range(r-2, bot_cleaner-1, -1):
arr[i+1][c-1] = arr[i][c-1]
for j in range(c-2, 0, -1):
arr[bot_cleaner][j+1] = arr[bot_cleaner][j]
arr[bot_cleaner][1] = 0
for tc in range(t):
spread()
top_cleaning()
bot_cleaning()
res = 2
for i in range(r):
res += sum(arr[i])
print(res)
'Python > Algorithm' 카테고리의 다른 글
[Python] 백준 2573. 빙산 (0) | 2023.10.26 |
---|---|
[Python] 백준 16236. 아기 상어 (0) | 2023.10.25 |
[Python] 백준 15686. 치킨배달 (0) | 2023.10.18 |
[Python] 백준 12919. A와 B 2 (0) | 2023.10.18 |
[Python] 백준 1715. 카드 정렬하기 (0) | 2023.10.18 |