취준/백준
[백준][Python][17144][시뮬레이션] 미세먼지 안녕!
puff
2020. 2. 15. 16:26
문제 : https://www.acmicpc.net/problem/17144
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사과는 뛰어난 코딩 실력을 이용해 각 칸 (r, c)에 있는 미세먼지의 양을 실시간으로 모니터링하는 시스템을 개발했다. (r, c)는 r행 c열을 의미한다. 공기청정기는 항상 왼쪽 열에 설치되어 있고, 크기는 두 행을 차지한다. 공기청정기가 설치되어 있지 않은 칸에는 미세먼
www.acmicpc.net
이 문제는 진짜 하라는 대로 하면된다.
내가 착각해서 고생했던 이유를 적는다.
- 미세먼지 확산 -> 공기청정기 작동 순서
- 문제를 잘 읽자.
- 확산은 1/5로 하되, 벽이거나 공기청정기 거나 해서 확산이 안된 부분은 다시 원래 자리에 넣어줘야 한다.
- 소수점 버리자. 파이썬은 특히 자동 형변환이라서 더 조심해야한다.
- 공기청정기 움직이는 방향 구현 조심
- 난 그래서 공기청정기를 기준으로 위/아래 방향을 각각 구현했다.
- 문제의 upper/lower cleaner 부분이다.
import sys
from collections import deque
r,c,t = [int(i) for i in sys.stdin.readline().split()]
dx,dy = [1,-1,0,0],[0,0,1,-1]
d = []
cleaner = []
for i in range(r):
d.append( [int(i) for i in sys.stdin.readline().split()])
for y in range(r):
for x in range(c):
if d[y][x] == -1:
cleaner.append([y,x])
for i in range(t):
nd = [[0]*c for _ in range(r)]
for y in range(r):
for x in range(c):
if d[y][x] != -1:
tospread = 0
for a in range(4):
ny,nx = y+dy[a],x+dx[a]
if 0<=ny<r and 0<=nx<c:
if d[ny][nx] != -1:
tospread+=1
nd[ny][nx]+=d[y][x]//5
nd[y][x] += d[y][x]- (d[y][x]//5)*tospread
else:
nd[y][x] = -1
d = nd
#upper cleaner
for a in reversed(range(1,cleaner[0][0]+1)):
d[a][0] = d[a-1][0]
d[0] = d[0][1:] + [0]
for a in range(cleaner[0][0]):
d[a][c-1] = d[a+1][c-1]
d[cleaner[0][0]] =[-1,0]+ d[cleaner[0][0]][1:c-1]
#lower cleaner
for a in range(cleaner[1][0],r-1):
d[a][0] = d[a+1][0]
d[r-1] = d[r-1][1:] + [0]
for a in reversed(range(cleaner[1][0]+1,r)):
d[a][c-1] = d[a-1][c-1]
d[cleaner[1][0]] =[-1,0]+ d[cleaner[1][0]][1:c-1]
ans = 0
for y in range(r):
for x in range(c):
if d[y][x] != -1:
ans+=d[y][x]
print(ans)