Computer Science/알고리즘

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

바보1 2023. 2. 23. 16:37

0.  문제 링크

 

 

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net


1.  풀이 방법

 

 

사실 구현은 그냥 하라는 대로 하면 돼서 크게 어렵지는 않은 것 같다.

먼지를 분산시키고, 이후에 바람을 불었다.

다만 바람을 부는 과정이 조금 쉽지 않았는데, 방향을 전환하면서, 현재 값은 이전 값이 저장된 변수로 대체하고, 현재 값을 변수에 넣는 과정을 반복하면 해결되었다.


2.  코드

 

 

r, c, t = map(int, input().split())
maps = [list(map(int, input().split())) for _ in range(r)]
vac = []
for i in range(r):
    if maps[i][0] == -1:
        vac.append(i)       # 청정기의 위치를 찾음


def spread(maps, sp_maps):      # 먼지 분산
    for i in range(r):
        for j in range(c):
            if maps[i][j] != -1 and maps[i][j] > 0:
                sp_dust = maps[i][j] // 5
                for dy, dx in [(-1, 0), (0, 1), (1, 0), (0, -1)]:
                    ny, nx = i + dy, j + dx
                    if 0 <= ny < r and 0 <= nx < c and maps[ny][nx] != -1:
                        sp_maps[ny][nx] += sp_dust
                        maps[i][j] -= sp_dust
                sp_maps[i][j] += maps[i][j]

    return sp_maps      # 새로운 맵에 넣음


def up():       # 위쪽 바람
    dy, dx = [0, -1, 0, 1], [1, 0, -1, 0]
    dir = 0
    before = 0      # 이전 값을 저장
    y, x = vac[0], 1        # 바로 오른쪽부터 시작
    while True:
        ny, nx = y + dy[dir], x + dx[dir]       # 움직임
        if y == vac[0] and x == 0:
            maps[y][x] = 0      # 만약 청정기에 도달하면 0으로 만들고 끝냄
            break
        if not (0 <= ny < r and 0 <= nx < c):       # 모서리에 도달하면 방향을 전환함
            dir += 1
            continue
        maps[y][x], before = before, maps[y][x]     # 현재 값을 저장하고, 이전 값을 현재 위치에 넣음
        y, x = ny, nx


def down():     # 아래쪽 바람
    dy, dx = [0, 1, 0, -1], [1, 0, -1, 0]
    dir = 0
    before = 0
    y, x = vac[1], 1
    while True:
        ny, nx = y + dy[dir], x + dx[dir]
        if y == vac[1] and x == 0:
            maps[y][x] = 0
            break
        if not(0 <= ny < r and 0 <= nx < c):
            dir += 1
            continue
        maps[y][x], before = before, maps[y][x]
        y, x = ny, nx

def count(maps):
    sum = 0
    for i in range(r):
        for j in range(c):
            sum += maps[i][j]
    return sum


for _ in range(t):
    maps = spread(maps, [[0] * c for _ in range(r)])
    up()
    down()
print(count(maps))

3.  마무리