Programming/Python
[파이썬] 백준 17144번: 미세먼지 안녕!
IN.0
2020. 5. 1. 02:13
728x90
반응형
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def spread(x, y): # 먼지 증식
cnt = board[x][y] # 현재 먼지의 수
for d in range(4): # 상하좌우
X = x + dx[d]
Y = y + dy[d]
if 0 <= X < R and 0 <= Y < C: # 위치가 board 안인지 체크
if board[X][Y] >= 0: # 위치에 청소기가 없다면
sub_board[X][Y] += board[x][y]//5 # 새로운 board에 먼지 증식
cnt -= board[x][y]//5 # 증식한 만큼 빼기
sub_board[x][y] += cnt # 새로운 board에 증식한 먼지를 제외한 만큼 넣기
def cleanup(x): # 청소기 윗부분 처리
dx = [0, -1, 0, 1] # 청소 진행방향 우, 상, 좌, 하
dy = [1, 0, -1, 0]
now = sub_board[x][1] # 첫번째 청소할 구역의 먼지 기록
sub_board[x][1] = 0 # 첫번째 구역 청소
d = 0 # 방향
X = x
Y = 1
while True:
X += dx[d]
Y += dy[d]
next = sub_board[X][Y] # 청소 예정 구역의 먼지 기록
sub_board[X][Y] = now # 청소 (앞에서 가져온 먼지 저장)
now = next # next에서 기록한 먼지를 다음에 쓰기 위해 now로 옮김
if X + dx[d] < 0 or X + dx[d] > x or Y + dy[d] < 0 or Y + dy[d] >= C: # 방향을 바꿔야할 때
d += 1
if d == 4: # 모든 방향을 청소했을 때
break
def cleandown(x): # 청소기 아랫부분 처리
dx = [0, 1, 0, -1] # 청소 진행방향 우, 하, 좌, 상
dy = [1, 0, -1, 0]
# cleanup 함수와 동일. (방향 바꾸기 처리만 다름)
now = sub_board[x][1]
sub_board[x][1] = 0
d = 0
X = x
Y = 1
while True:
X += dx[d]
Y += dy[d]
next = sub_board[X][Y]
sub_board[X][Y] = now
now = next
if X + dx[d] < x or X + dx[d] >= R or Y + dy[d] < 0 or Y + dy[d] >= C:
d += 1
if d == 4:
break
R, C, T = map(int, input().split())
board = []
for _ in range(R):
board.append(list(map(int, input().split())))
v1 = 0 # 청소기 윗부분
v2 = 1 # 청소기 아랫부분
for i in range(R):
if board[i][0] == -1: # 청소기 위치찾기
v1 = i
v2 = i+1
break
for _ in range(T): # 몇회 반복
sub_board = [[0]*C for __ in range(R)] # 결과를 임시기록할 board
for i in range(R):
for j in range(C):
if board[i][j] > 0: # 먼지가 있으면
spread(i, j) # 먼지 증식
cleanup(v1)
cleandown(v2)
sub_board[v1][0] = -1 # 청소기 위치에 청소기 저장
sub_board[v2][0] = -1
board = sub_board # 임시기록한 board를 진짜 board에 옮김
answer = 0
for i in range(R):
for j in range(C):
answer += board[i][j]
print(answer+2) # 청소기(-1)가 2칸 포함되어있기 때문에 +2
728x90
반응형