Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

해야만 한다

[Python] 백준 17144. 미세먼지 안녕! 본문

Python/Algorithm

[Python] 백준 17144. 미세먼지 안녕!

쥬링999 2023. 10. 23. 11:40

 

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