[BOJ] 17144. 미세먼지 안녕!(python)
📌문제
💪아이디어
공기청정기 위치
미세먼지 위치
미세먼지는 동시에확산되기 때문에 확산 전에 미세먼지의 위치를 queue에 미리 넣는다.미세먼지 확산
미리 넣어놓은 미세먼지 위치를 돌면서 미세먼지 양을 감소시킨다.
이때 주의할 점은 확산되는 양을 계산할 때 board의 값을 직접 접근해서는 안된다.
앞에서 확산된 후 더해져 갱신된 값으로 확산될 수도 있기 때문이다.
미세먼지의 위치를 queue에 넣을 때 미세먼지 양도 함께 넣어주면 별도의 배열복사를 하지 않아도 된다.
공기청정기 순환
위쪽 공기청정기는 반시계방향, 아래쪽 공기청정기는 시계방향으로 board값을 옮겨준다.- t초 동안 2번 ~ 4번 반복하기
- 남은 미세먼지 양구하기
board값을 모두 구하면 공기청정기값인 -1가 두번 더해지기때문에 결과값에 +2해준다.
🥂코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import sys; input = sys.stdin.readline
from collections import deque
dy = (-1,0,1,0)
dx = (0,1,0,-1)
def initQ():
for i in range(1,r+1):
for j in range(1,c+1):
if board[i][j] > 0: queue.append((i,j,board[i][j]))
def spread():
while queue:
y,x, amount = queue.popleft()
vol = amount // 5
if vol == 0: continue
for i in range(4):
ny, nx = y + dy[i], x + dx[i]
if 0 < ny <= r and 0 < nx <= c and board[ny][nx] != -1:
board[ny][nx] += vol
board[y][x] -= vol
def cleaning(aircleaner,move):
y, x = aircleaner
tmp = 0
i = 1
ny, nx = y, x
for _ in range(4):
ny, nx = ny + dy[i], nx + dx[i]
while True:
tmp, board[ny][nx] = board[ny][nx], tmp
if 1 <= ny + dy[i] <= r and 1 <= nx + dx[i] <= c:
ny += dy[i]
nx += dx[i]
else: break
if ny == y and nx == x: break
i = (i + move) % 4
r, c, t = map(int,input().split())
board = [[0 for _ in range(c+1)] for _ in range(r+1)]
airCleaner = []
queue = deque()
for i in range(1,r+1):
board[i][1:] = list(map(int,input().split()))
if len(airCleaner) != 2:
for j in range(1,c+1):
if board[i][j] == -1: airCleaner.append((i,j))
for _ in range(t):
initQ()
spread()
cleaning(airCleaner[0],-1)
cleaning(airCleaner[1],1)
answer = 0
for b in board:
answer += sum(b)
print(answer + 2)
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.