본문 바로가기
ALGORITHM/BAEKJOON

[BOJ/Python] 17144. 미세먼지 안녕!

by 안녕나는현서 2021. 10. 20.
728x90

📌 문제

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

 

📌 문제 접근 방법

  1. 단순 구현 문제! 문제가 시키는 대로 따라서 구현하면 된다.
  2. spread 함수를 만들어서 미세먼지가 퍼지도록 한다.
    dust라는 배열을 따로 만들어서 각 위치의 먼지 변화량을 저장하고 원래 배열과 더해준다.
  3. clean 함수를 만들어서 공기청정기를 가동시킨다.
    공기청정기의 위치와 방향을 매개변수로 받아서 해당하는 방향대로 값을 swap해준다.
  4. 2, 3의 과정을 T번만큼 반복 후, 배열의 합을 구해준다.
    공기청정기는 -1로 표시되어 있으므로 2를 더해준다.

 

📌 코드

# 백준 17144 미세먼지 안녕!

def spread():
    global arr

    dust = [[0 for _ in range(C)] for _ in range(R)]

    dij = [(1, 0), (-1, 0), (0, 1), (0, -1)]

    for i in range(R):
        for j in range(C):
            if arr[i][j] > 0:
                cnt = 0
                move_dust = arr[i][j] // 5

                for di, dj in dij:
                    ni, nj = i+di, j+dj

                    if 0 <= ni < R and 0 <= nj < C and arr[ni][nj] != -1:
                        dust[ni][nj] += move_dust
                        cnt += 1
                
                dust[i][j] -= move_dust*cnt
    
    for i in range(R):
        for j in range(C):
            arr[i][j] += dust[i][j]


def clean(m, dxy):
    i = 0
    nx = m
    ny = 0
    temp = 0
    while i < 4:
        nx += dxy[i][0]
        ny += dxy[i][1]

        if nx == m and ny == 0:
            return

        if 0 <= nx < R and 0 <= ny < C:
            temp, arr[nx][ny] = arr[nx][ny], temp
        else:
            nx -= dxy[i][0]
            ny -= dxy[i][1]
            i += 1


R, C, T = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(R)]

machine = 0
for i in range(R):
    if arr[i][0] == -1:
        machine = i
        break

for _ in range(T):
    spread()
    
    # 반시계방향
    dxy = [(0, 1), (-1, 0), (0, -1), (1, 0)] # 오위왼아
    clean(machine, dxy)

    # 시계방향
    dxy = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 오아왼위
    clean(machine+1, dxy)

print(sum(map(sum, arr)) + 2)
728x90

댓글