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

김서영·2022년 7월 7일

코딩테스트 스터디

목록 보기
6/11

PYPY3

우선 먼지가 확산되는 것은 diffuse() 함수를 통해 확산되고, 공기청정기는 cleanup() 함수를 통해 먼지를 이동 및 흡수한다.
중요한 것은 공기청정기로 먼지를 이동 및 흡수 시킬 때였다. 요령이 없어서 그냥 하나하나 구현했다.
공기청정기의 위, 아래를 나누는 것은 물론 위에서도 진행 방향대로 4개를 나눔.
위 공기청정기를 통해 오른쪽 - 위쪽 - 왼쪽 - 아래쪽 으로 먼지가 이동하고
아래 공기청정기를 통해 오른쪽 - 아래쪽 - 왼쪽 - 위쪽 으로 먼지가 이동함.

import sys
from copy import deepcopy

r,c,t = map(int,sys.stdin.readline().split())
arr = []
for _ in range(r):
    arr.append(list(map(int,sys.stdin.readline().split())))
# 북 동 남 서
dx = [0,1,0,-1]
dy = [-1,0,1,0]

airc = []

# 먼지의 확산
def diffuse():
    newarr = deepcopy(arr)
    for i in range(r):
        for j in range(c):
        
            # 공기청정기 위치 미리 저장해두기
            if arr[i][j] == -1:
                airc.append([i,j])
                
            # 먼지 확산시키기, 최소 먼지의 양이 5이상이어야 확산이 됨
            if arr[i][j] > 4:
                cnt = 0
                amt = arr[i][j] // 5
                for k in range(4):
                    y = j + dx[k]
                    x = i + dy[k]
                    if 0<=x<r and 0<=y<c and newarr[x][y] != -1:
                        newarr[x][y] += amt
                        cnt += 1
                newarr[i][j] -= amt*cnt
    return newarr

# 공기청정기의 역할 : 먼지 이동 및 흡수
# 나는 공기청정기의 위, 아래를 나누는 것은 물론 위에서도 진행 방향대로 4개를 나눔
# 위 공기청정기를 통해 오른쪽 - 위쪽 - 왼쪽 - 아래쪽   으로 먼지가 이동하고
# 아래 공기청정기를 통해 오른쪽 - 아래쪽 - 왼쪽 - 위쪽 으로 먼지가 이동함.
def cleanup(arr):
    newarr = deepcopy(arr)

    nxy2 = newarr[0][c-1]
    nxy3 = newarr[0][0]
    nxy4 = newarr[r-1][c-1]#4
    nxy5 = newarr[r-1][0] #0


    # 위쪽 공기청정기
    x,y = airc[0]
    
    nxy1 = newarr[x][c-1]
    cur = newarr[x][y+1]
    for i in range(y+1,c-1):
        nxt = newarr[x][i+1]
        if i == y+1:
            newarr[x][i] = 0
        newarr[x][i+1] = cur
        cur = nxt


    cur = newarr[x-1][c-1]  #6
    newarr[x-1][c-1] = nxy1 #5
    for i in range(x-1,-1,-1):
        nxt = newarr[i-1][c-1]
        newarr[i-1][c-1] = cur
        cur = nxt

    cur = newarr[0][c-2] #1
    newarr[0][c-2] = nxy2 #8
    for i in range(c-2,0,-1):
        nxt = newarr[0][i-1]
        newarr[0][i-1] = cur
        cur = nxt

    cur = newarr[1][0] #0
    newarr[1][0] = nxy3
    for i in range(1,x-1):
        nxt = newarr[i+1][0]
        newarr[i+1][0] = cur
        cur = nxt
    
    
    # 아래쪽 공기청정기
    x,y = airc[1]
    nxy1 = newarr[x][c-1]
 
    cur = newarr[x][y+1]
    for i in range(y+1,c-1):
        nxt = newarr[x][i+1]
        if i == y+1:
            newarr[x][i] = 0
        newarr[x][i+1] = cur
        cur = nxt

    
    cur = newarr[x+1][c-1] #8
    newarr[x+1][c-1] = nxy1 #0
    for i in range(x+1,r-1):
        nxt = newarr[i+1][c-1]
        newarr[i+1][c-1] = cur
        cur = nxt

 

    cur = newarr[r-1][c-2] 
    newarr[r-1][c-2] = nxy4 #4
    for i in range(c-2,0,-1):
        nxt = newarr[r-1][i-1]
        newarr[r-1][i-1] = cur
        cur = nxt

    cur = newarr[r-2][0] 
    newarr[r-2][0] = nxy5
    for i in range(r-2,x+1,-1):
        nxt = newarr[i-1][0]
        newarr[i-1][0] = cur
        cur = nxt

    return newarr
            
# 각 초마다 먼지 확산 및 공기청정기 작동     
for _ in range(t):
    arr = diffuse()
    #print("start",arr)
    arr = cleanup(arr)
    #print("end",arr)


# 먼지의 양을 모두 더하고 공기청정기 값은 빼줘야 하므로 + 2
res = 0
for i in range(r):
    res += sum(arr[i])
print(res+2)

모범 답안 참고

https://kyun2da.github.io/2021/04/20/brownsmog/

profile
하지만 저는 이겨냅니다. 김서영이죠?

0개의 댓글