본문 바로가기

취준/백준

[백준][Python][17144][시뮬레이션] 미세먼지 안녕!

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

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다. 공기청정기는 항상 왼쪽 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼

www.acmicpc.net

 

이 문제는 진짜 하라는 대로 하면된다.

내가 착각해서 고생했던 이유를 적는다.

 

  1. 미세먼지 확산 -> 공기청정기 작동 순서
    1. 문제를 잘 읽자. 
    2. 확산은 1/5로 하되, 벽이거나 공기청정기 거나 해서 확산이 안된 부분은 다시 원래 자리에 넣어줘야 한다.
    3. 소수점 버리자. 파이썬은 특히 자동 형변환이라서 더 조심해야한다.
  2. 공기청정기 움직이는 방향 구현 조심
    1. 난 그래서 공기청정기를 기준으로 위/아래 방향을 각각 구현했다.
    2. 문제의 upper/lower cleaner 부분이다.

 

import sys
from collections import deque

r,c,t = [int(i) for i in sys.stdin.readline().split()]

dx,dy = [1,-1,0,0],[0,0,1,-1]
d = []
cleaner = []

for i in range(r):
    d.append( [int(i) for i in sys.stdin.readline().split()])
    

    
for y in range(r):
    for x in range(c):
        if d[y][x] == -1:
            cleaner.append([y,x])
        
            
            
for i in range(t):
    nd = [[0]*c for _ in range(r)]
    
    for y in range(r):
        for x in range(c):
            if d[y][x] != -1:
                tospread = 0
                for a in range(4):
                    ny,nx = y+dy[a],x+dx[a]
                    
                    if 0<=ny<r and 0<=nx<c:
                        if d[ny][nx] != -1:
                            tospread+=1
                            nd[ny][nx]+=d[y][x]//5
                            

                nd[y][x] += d[y][x]- (d[y][x]//5)*tospread
            else:
                nd[y][x] = -1
    
                
    d = nd
    
    #upper cleaner
    
    for a in reversed(range(1,cleaner[0][0]+1)):
        d[a][0] = d[a-1][0]
        
    d[0] = d[0][1:] + [0]
    
    for a in range(cleaner[0][0]):
        d[a][c-1] = d[a+1][c-1]
        
    d[cleaner[0][0]] =[-1,0]+ d[cleaner[0][0]][1:c-1]
    

    #lower cleaner
             
    for a in range(cleaner[1][0],r-1):
        d[a][0] = d[a+1][0]
        
    d[r-1] = d[r-1][1:] + [0]
    
    for a in reversed(range(cleaner[1][0]+1,r)):
        d[a][c-1] = d[a-1][c-1]
        
    d[cleaner[1][0]] =[-1,0]+ d[cleaner[1][0]][1:c-1]

ans = 0
for y in range(r):
    for x in range(c):
        if d[y][x] != -1:
            ans+=d[y][x] 
            
print(ans)