문제 : https://www.acmicpc.net/problem/17144
이 문제는 진짜 하라는 대로 하면된다.
내가 착각해서 고생했던 이유를 적는다.
- 미세먼지 확산 -> 공기청정기 작동 순서
- 문제를 잘 읽자.
- 확산은 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)
'취준 > 백준' 카테고리의 다른 글
[백준][Python][1931][그리디] 회의실배정 (0) | 2020.02.17 |
---|---|
[백준][Python][1780][분할정복] 종이의 개수 (0) | 2020.02.16 |
[백준][Python][12865][DP]평범한 배낭 (0) | 2020.02.15 |
[백준][Python][17404][DP] RGB거리 2 (0) | 2020.02.14 |
[백준][11052번, 16194번][Python] 카드 구매하기 1,2 && 블로그 닉값의 위험성 (0) | 2020.02.12 |