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
반응형