코딩테스트/백준

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

ye0nn 2023. 3. 28. 15:22

 

 

 

 

 

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

 

 

 

 

 

✅  Solution

  • 단순한 구현 문제이다. 그런데 공기청정기 동작 구현이 좀 어려워서 찾아봤다. 
  • 먼저 확산의 경우, 상하좌우를 체크해서 범위 내에 있고 공기청정기의 위치가 아닐 때 확산되는 양을 더해준다.
  • 그리고 그만큼의 양을 원래 양에서 빼준다.
  • 다음으로 공기청정기 동작은 시계방향, 반시계방향을 따로 처리해 줬다. 
  • 방향대로 쭉 밀어서 위치하도록 한다.
  • 위의 과정을 t번만큼 반복하고 미세먼지의 양을 모두 더해주면 된다.

 

 

 

 

 

✅ Code

import sys
input = sys.stdin.readline

def diffuse():
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
	
    # 확산은 동시에 일어나기 때문에 따로 배열은 선언 후 마지막에 한번에 처리해준다.
    diffused = [[0] * c for _ in range(r)]

    for x in range(r):
        for y in range(c):
            if data[x][y] <= 0:
                continue

            dust = data[x][y] // 5

            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                
                # 범위 내에 있고 공기 청정기의 위치가 아닐 때 
                if 0 <= nx < r and 0 <= ny < c and data[nx][ny] != -1:
                    diffused[nx][ny] += dust
                    diffused[x][y] -= dust
    
    # 확산된 양 반영  
    for x in range(r):
        for y in range(c):
            data[x][y] += diffused[x][y]

# 시계 방향
def clean_dust_up():
    dx = [0, -1, 0, 1]
    dy = [1, 0, -1, 0]

    x, y, direction = m1, 1, 0
    prev = 0

    while True:
        nx = x + dx[direction]
        ny = y + dy[direction]
        
        # 방향대로 모두 한칸씩 미뤘을 때 
        if x == m1 and y == 0:
            break

        if 0 > nx or nx >= r or 0 > ny or ny >= c:
            direction += 1
            continue

        data[x][y], prev = prev, data[x][y]
        x, y = nx, ny

# 반시계 방향
def clean_dust_down():
    dx = [0, 1, 0, -1]
    dy = [1, 0, -1, 0]

    x, y, direction = m2, 1, 0
    prev = 0

    while True:
        nx = x + dx[direction]
        ny = y + dy[direction]

        # 방향대로 모두 한칸씩 미뤘을 때 
        if x == m2 and y == 0:
            break

        if 0 > nx or nx >= r or 0 > ny or ny >= c:
            direction += 1
            continue

        data[x][y], prev = prev, data[x][y]
        x, y = nx, ny


r, c, t = map(int, input().split())
data = [list(map(int, input().split())) for _ in range(r)]
answer = 0

# 공기청정기의 위치 
for i in range(r):
    if data[i][0] == -1:
        m1 = i
        m2 = i + 1
        break

for _ in range(t):
    diffuse()
    clean_dust_up()
    clean_dust_down()

for i in range(r):
    for j in range(c):
        if data[i][j] > 0:
            answer += data[i][j]

print(answer)