본문 바로가기

코딩테스트/Python

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

문제


https://www.acmicpc.net/problem/17144

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

 

 

 

풀이


 

import sys
r,c,t = map(int,input().split())

arr = [list(map(int,sys.stdin.readline().strip().split())) for _ in range(r)]

# 공기 청정기 위치 찾기
for i in range(r):
    if arr[i][0] == -1:
        up = i
        down = i+1
        break

# 미세먼지 확산
def dust():
    di = [1,0,-1,0] # 하,우,상,좌
    dj = [0,1,0,-1]
    tmpArr = [[0]*c for j in range(r)]
    for i in range(r):
        for j in range(c):
            if arr[i][j]>=5:
                cnt=0
                for k in range(4):
                    x = di[k]+i
                    y = dj[k]+j
                    if 0<=x<r and 0<=y<c and arr[x][y] != -1:
                        tmpArr[x][y] += arr[i][j]//5 
                        cnt+=1
                tmpArr[i][j] -= arr[i][j]//5*cnt
    for i in range(r):
        for j in range(c):
            arr[i][j] = arr[i][j] + tmpArr[i][j]


# 공기 청정기 위쪽 이동
def air_up():
    dx = [0,-1,0,1]
    dy = [1,0,-1,0]
    direct = 0
    before = 0
    x,y = up,1
    while True:
        nx = x + dx[direct]
        ny = y + dy[direct]
        if x == up and y == 0:
            break
        if not 0 <= nx < r or not 0<= ny < c:
            direct += 1
            continue
        arr[x][y],before = before,arr[x][y]
        x = nx
        y = ny

# 공기 청정기 아래쪽 이동
def air_down():
    dx = [0,1,0,-1]
    dy = [1,0,-1,0]
    direct = 0
    before = 0
    x,y = down,1
    while True:
        nx = dx[direct] + x
        ny = dy[direct] + y
        if x == down and y == 0:
            break
        if not 0<=nx<r or not 0<=ny<c:
            direct+=1
            continue
        arr[x][y],before = before,arr[x][y]
        x = nx
        y = ny

for _ in range(t):
    dust()
    air_up()
    air_down()


sol = 0
for i in range(r):
    for j in range(c):
        sol+=arr[i][j]
print(sol+2)

먼저 확산을 계산해준다.

공기청정기 위쪽 이동을 해준다.

아래쪽 이동을 해준다.

 

 

'코딩테스트 > Python' 카테고리의 다른 글

[Python] 백준 #2583 - 영역 구하기  (0) 2022.05.15
[Python] 백준 #2468 - 안전 영역  (0) 2022.05.15
[Python] 백준 #4375 - 1  (0) 2022.05.15
[Python] 백준 #3986 - 좋은 단어  (0) 2022.05.15
[Python] 백준 #1940 - 주몽  (0) 2022.05.15