백준 17144 - 미세먼지 안녕!

Beomsun·2022년 2월 9일
0

algorithm

목록 보기
2/35

백준 - 17144 미세먼지 안녕!

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

1초 동안에 발생되는 일은

  1. 미세먼지가 확산된다. 확산은 미세먼지가 있는 모든 칸에서 동시에 일어난다.

    • (r, c)에 있는 미세먼지는 인접한 네 방향으로 확산된다.

    • 인접한 방향에 공기청정기가 있거나, 칸이 없으면 그 방향으로는 확산이 일어나지 않는다.

    • 확산되는 양은 Ar,c/5이고 소수점은 버린다.

    • (r, c)에 남은 미세먼지의 양은 Ar,c - (Ar,c/5)×(확산된 방향의 개수) 이다.

  2. 공기청정기가 작동한다.

    • 공기청정기에서는 바람이 나온다.
    • 위쪽 공기청정기의 바람은 반시계방향으로 순환하고, 아래쪽 공기청정기의 바람은 시계방향으로 순환한다.
    • 바람이 불면 미세먼지가 바람의 방향대로 모두 한 칸씩 이동한다.
    • 공기청정기에서 부는 바람은 미세먼지가 없는 바람이고, 공기청정기로 들어간 미세먼지는 모두 정화된다.

위의 내용대로 구현하면 되는 구현 문제이다.

"""
17144  미세먼지 안녕!

간단했다. 주어진 내용대로 구현하면 됐다.
주의할 점은 확산 할 때 확산의 원인이 되는 지역의 값을 가지고 있어야한다. 조금 까다로운 점이 확산 이 후 청소가 살짝 까다로웠다. 디버깅을 많이 했다.
공기 청정기 작동 시 배열 회전을 적용하면 정답을 도출 할 수 있다.



    
"""



R,C,T = map(int, input().split())
import math
"""
확산되는 양은 Ar,c/5

미세먼지의 양은 Ar,c - (Ar,c/5)×(확산된 방향의 개수)
"""
grid = []
grid_copy = [[0]* C for _ in range(R)]
for i in range(R):
    data = list(map(int,input().split()))
    grid.append(data)

# grid[r][c] == -1 -> 공기청소기
dr = [1,-1,0,0]
dc = [0,0,1,-1]
air_clear_pos = []
## 미세먼지 확산 
def diffusion(r,c,dust_cnt):
    cnt = 0
    for i in range(4):
        next_r = r + dr[i]
        next_c = c + dc[i]
        if 0<=next_r<R and 0<=next_c < C and grid[next_r][next_c] > -1:
            cnt+=1
            grid[next_r][next_c] += math.trunc(dust_cnt/5)
    grid[r][c]-=math.trunc(dust_cnt/5)*cnt

## 공기청정기 작동
def clearDust():
    ## 위방향
    up_r = air_clear_pos[0][0]
    # 4가지 방향으로 돈다
    # 1 바텀 라이트
    for i in range(2,C):
        tmp = grid[up_r][i-1]
        grid[up_r][i-1] = 0
        grid_copy[up_r][i] = tmp
    # #2 바텀 업
    for i in range(up_r,0,-1):
        tmp = grid[i][C-1]
        grid[i][C-1] = 0
        grid_copy[i-1][C-1] = tmp
    # #3 탑 레프트
    for i in range(C-2,-1,-1):
        tmp = grid[0][i+1]
        grid[0][i+1] = 0
        grid_copy[0][i] = tmp
    # #4 탑 다운
    for i in range(1, up_r+1):
        tmp = grid[i-1][0]
        grid[i-1][0] = 0
        grid_copy[i][0] = tmp
    #### 아래방향
    down_r = air_clear_pos[1][0]
    # 1 탑 라이트
    for i in range(2,C):
        tmp = grid[down_r][i-1]
        grid[down_r][i-1] = 0
        grid_copy[down_r][i] = tmp
    # #2 탑 다운
    for i in range(down_r+1,R):
        tmp = grid[i-1][C-1]
        grid[i-1][C-1] = 0
        grid_copy[i][C-1] = tmp
    # #3 바텀 레프트
    for i in range(C-2,-1,-1):
        tmp = grid[R-1][i+1]
        grid[R-1][i+1] = 0
        grid_copy[R-1][i] = tmp
    # # #4 바텀 업
    for i in range(R-1, down_r,-1):
        tmp = grid[i][0]
        grid[i][0] = 0
        grid_copy[i-1][0] = tmp

## 적용하기
def adjust():
    for i in range(R):
        for j in range(C):
            if grid_copy[i][j] >0:
                grid[i][j] = grid_copy[i][j]
    ## 공기청정기 재설치
    grid[air_clear_pos[0][0]][air_clear_pos[0][1]] = -1
    grid[air_clear_pos[1][0]][air_clear_pos[1][1]] = -1

for k in range(T):
    dust = []

    for i in range(R):
        for j in range(C):
            if grid[i][j] > 0:
                dust.append((i,j,grid[i][j]))
            elif grid[i][j] == -1:
                air_clear_pos.append((i,j))

    for rr,cc,d_c in dust:
        diffusion(rr,cc,d_c)
    clearDust()
    adjust()
    grid_copy = [[0]* C for _ in range(R)]

ret = 0
for i in range(R):
    for j in range(C):
        if grid[i][j] >0:
            ret+=grid[i][j]
print(ret)

0개의 댓글

관련 채용 정보