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

신남·2022년 9월 19일

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

공부 날짜 : 2022.09.19
정답 참조 여부 : X

미세먼지는 1초마다 확산하고 공기청정기는 위치에따라 순환시키며 들어오는 먼지를 정화할때 t의 시간이 흐른후 남은 먼지의 개수를 구하는 문제이다.


알고리즘은 사용하지 않고 문제에서 주어진대로 코드를 작성하면 되는 문제였다.
별로 어렵지도 않고 빡구현처럼 헷갈리는 부분도 없어서 금방 풀 수 있었다.
하지만 내가 생각한대로 코드를 작성했지만 시간초과가 나왔고 코드 수정없이 언어를 PyPy3로 바꿨더니 정답으로 나왔다.
이제까지 PyPy3로 자주 제출 해봤지만 Python3에서 시간초과를 수정없이 PyPy3로 바꿨다고 정답으로 나온경우는 처음이라 좀 신기했다.


PyPy3는 복잡한 코드(반복)에서 우세하고 간단한 코드상에서는 Python3가 우세하다고 하니 두 언어의 차이를 기억하고 코드작성후에 더 효율적이라고 생각되는 언어로 제출해야 할거 같다.

소스코드

import sys
from copy import deepcopy
input = sys.stdin.readline

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

#방의 정보를 담은 리스트
room = []
#공기 청정기의 위치정보를 담은 리스트
cleaner = []

for i in range(r):
    a = list(map(int, input().split()))
    if a[0] == -1:
        cleaner.append(i)
    room.append(a[:])

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

def diffusion(room):
    new_room = [[0 for _ in range(c)] for _ in range(r)]
    new_room[cleaner[0]][0] = -1
    new_room[cleaner[1]][0] = -1
    
    #모든 칸에 대해서
    for i in range(r):
        for j in range(c):
            #미세먼지가 있다면
            if room[i][j] > 0:
                #확산량
                diffuse_value = room[i][j]//5
                diffuse_count = 0
                
                #시간 단축을 위한 패스
                if diffuse_value == 0:
                    new_room[i][j] += room[i][j]
                    continue
                
                #모든 방향에 대해서
                for dir in range(4):
                    nx = j + dx[dir]
                    ny = i + dy[dir]
                    
                    #범위 이내이며 공기청정기가 없을때
                    if 0 <= nx < c and 0 <= ny < r and room[ny][nx] != -1:
                        new_room[ny][nx] += diffuse_value
                        diffuse_count += 1
                        
                #확산되고 남은양을 새방에 더하기
                new_room[i][j] += (room[i][j] - (diffuse_value * diffuse_count))
    
    return new_room
                

                
def clean():
    up_cleaner = cleaner[0]
    down_cleaner = cleaner[1]
    
    #공기청정기로 들어가는 먼지는 정화
    room[up_cleaner-1][0] = 0
    
    #위쪽 공기청정기의 반시계 방향으로 순환
    #왼쪽
    for i in range(up_cleaner -1 , 0, -1):
        room[i][0] = room[i-1][0]
    #위쪽
    for i in range(c-1):
        room[0][i] = room[0][i+1]
    #오른쪽
    for i in range(up_cleaner):
        room[i][-1] = room[i+1][-1]
    #아래쪽
    for i in range(c-1, 1, -1):
        room[up_cleaner][i] = room[up_cleaner][i-1]
    #공기청정기에서 나온 공기
    room[up_cleaner][1] = 0
    
    
    #공기청정기로 들어가는 먼지는 정화
    room[down_cleaner+1][0] = 0
    
    #아래쪽 공기청정기의 시계방향으로 순환
    #왼쪽
    for i in range(down_cleaner +1, r - 1):
        room[i][0] = room[i+1][0]
    #아래쪽
    for i in range(c-1):
        room[-1][i] = room[-1][i+1]
    #오른쪽
    for i in range(r-1,down_cleaner,-1):
        room[i][-1] = room[i-1][-1]
    #위쪽
    for i in range(c-1,1,-1):
        room[down_cleaner][i] = room[down_cleaner][i-1]
    #공기청정기에서 나온 공기
    room[down_cleaner][1] = 0
        
        
        
                        
for i in range(t):
    room = diffusion(deepcopy(room))
    clean()
    
result = 0

for i in range(r):
    for j in range(c):
        result += room[i][j]
        
#공기청정기 -1을 제외하기 위한 +2        
print(result + 2)        

0개의 댓글