chldkato

백준 17144 미세먼지 안녕! (파이썬) 본문

백준

백준 17144 미세먼지 안녕! (파이썬)

chldkato 2020. 3. 3. 19:41

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

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다. 공기청정기는 항상 왼쪽 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼

www.acmicpc.net

1. 미세먼지가 있는 지역 (1보다 큰 곳)을 큐에 넣고 공기청정기가 있는 곳의 x좌표를 sx에 저장한다

2. 확산한 지도를 저장하기 위한 temp1을 만들고 큐에 있는 좌표를 불러와서 조건대로 미세먼지를 확산한다

3. 공기가 순환한 지도를 저장하기 위한 temp2를 만들고 방향 순서대로 구현한다

   flag가 1이면 반시계순환, 2이면 시계순환으로 구현

4. 순환을 끝내면 공기청정기 바로 앞을 0으로 만들고 최초로 만든 지도인 a를 순환까지 끝난 temp2로 바꾼다

5. 주어진 시간만큼 앞의 과정을 반복 후 지도내의 모든 숫자를 합하고 공기청정기인 -1이 있으므로 2를 더해 출력

from collections import deque
import sys, copy

input = sys.stdin.readline
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]

m, n, t = map(int, input().split())
q = deque()

a = []
for i in range(m):
    row = list(map(int, input().split()))
    a.append(row)
    for j in range(n):
        if a[i][j] > 0:
            q.append([i, j])
        if a[i][j] == -1:
            sx = i

for _ in range(t):
    temp1 = copy.deepcopy(a)
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < m and 0 <= ny < n:
                if a[nx][ny] >= 0:
                    temp1[nx][ny] += a[x][y] // 5
                    temp1[x][y] -= a[x][y] // 5

    temp2 = copy.deepcopy(temp1)
    x, y, flag, turn = sx - 1, 1, 1, 1
    while True:
        if turn == 1:
            temp2[x][y+1] = temp1[x][y]
            y += 1
            if y + 1 == n:
                turn = 2
        elif turn == 2:
            if flag == 1:
                temp2[x-1][y] = temp1[x][y]
                x -= 1
                if x - 1 == -1:
                    turn = 3
            if flag == 2:
                temp2[x+1][y] = temp1[x][y]
                x += 1
                if x + 1 == m:
                    turn = 3
        elif turn == 3:
            temp2[x][y-1] = temp1[x][y]
            y -= 1
            if y - 1 == -1:
                turn = 4
        elif turn == 4:
            if flag == 1:
                if x + 1 == sx - 1:
                    x, y, flag, turn = sx, 1, 2, 1
                    continue
                temp2[x+1][y] = temp1[x][y]
                x += 1
            if flag == 2:
                if x - 1 == sx:
                    break
                temp2[x-1][y] = temp1[x][y]
                x -= 1

    temp2[sx-1][1], temp2[sx][1] = 0, 0
    a = temp2

    for i in range(m):
        for j in range(n):
            if a[i][j] > 0:
                q.append([i, j])

ans = 0
for i in a:
    ans += sum(i)
print(ans+2)

'백준' 카테고리의 다른 글

백준 17143 낚시왕 (파이썬)  (0) 2020.03.04
백준 17142 연구소 3 (파이썬)  (0) 2020.03.03
백준 1912 연속합 (파이썬)  (0) 2020.03.03
백준 2193 이친수 (파이썬)  (0) 2020.03.03
백준 2133 타일 채우기 (파이썬)  (0) 2020.03.03
Comments