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

박형진·2023년 5월 25일

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


1. 코드

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

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

dusts = []
machine = []
for i in range(R):
    for j in range(C):
        if graph[i][j] > 0:
            dusts.append((i, j))
        elif graph[i][j] == -1:
            machine.append((i, 0))

up_track = []
down_track = []

x, y = machine[0][0], machine[0][1]
for i in range(1, C):
    up_track.append((x, i))
for i in range(x-1, -1, -1):
    up_track.append((i, C-1))
for i in range(C-2, -1, -1):
    up_track.append((0, i))
for i in range(1, x):
    up_track.append((i, 0))

x, y = machine[1][0], machine[1][1]
for i in range(1, C):
    down_track.append((x, i))
for i in range(x+1, R):
    down_track.append((i, C-1))
for i in range(C-2, -1, -1):
    down_track.append((R-1, i))
for i in range(R-2, x, -1):
    down_track.append((i, 0))

for _ in range(T):
    add = []
    minus = []
    for x, y in dusts:
        able_dir = []
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < R and 0 <= ny < C and (nx, ny) not in machine:
                able_dir.append((nx, ny))
        qty = graph[x][y] // 5
        minus.append((x, y, qty * len(able_dir)))
        for X, Y in able_dir:
            add.append((X, Y, qty))

    for x, y, qty in add:
        graph[x][y] += qty
    for x, y, qty in minus:
        graph[x][y] -= qty

    graph[up_track[-1][0]][up_track[-1][1]] = 0
    for i in range(len(up_track)-1, 0, -1):
        move_before = up_track[i-1]
        move_after = up_track[i]
        graph[move_after[0]][move_after[1]] = graph[move_before[0]][move_before[1]]
    graph[up_track[0][0]][up_track[0][1]] = 0

    graph[down_track[-1][0]][down_track[-1][1]] = 0
    for i in range(len(down_track)-1, 0, -1):
        move_before = down_track[i-1]
        move_after = down_track[i]
        graph[move_after[0]][move_after[1]] = graph[move_before[0]][move_before[1]]
    graph[down_track[0][0]][down_track[0][1]] = 0

    dusts.clear()
    # dust refill
    for i in range(R):
        for j in range(C):
            if graph[i][j] >= 1:
                dusts.append((i, j))

ans = 0
for i in range(R):
    for j in range(C):
        ans += graph[i][j]
print(ans+2)

2. 후기

공기청정기로 위아래로 순환되는 두 개의 트랙의 좌표를 관리하는 배열을 사용했다. 배열은 기존 인덱스 값이 새로운 값으로 덮어지는 것을 방지하기 위해 배열의 뒤에서부터 쉬프트했다.

트랙을 나타내는 배열의 첫, 마지막 원소에 해당하는 좌표는 항상 0의 미세먼지로 초기화된다.

profile
안녕하세요!

0개의 댓글