백준 미세먼지 안녕! 코드 및 해설 (파이썬)

2021. 11. 3. 13:34algorithm

반응형

https://www.acmicpc.net/problem/17144

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

 

미세먼지의 양과 그 위치를 확인하는 함수, 미세먼지의 확산을 구현하는 함수, 공기청정기의 윗부분과 아랫부분의 확산을 구현하는 함수를 만들어 매 초마다 이 함수들을 실행해주었습니다.
미세먼지의 양과 위치를 확인하는 함수는 전체 방의 원소를 확인하면서 원소가 0보다 크면 위치와 양을 튜플로 저장했습니다. (행, 열, 미세먼지 양)
미세먼지의 확산을 구현하기 위해서 상하좌우가 방 안에 있고, 공기청정기가 없으면 확산하도록 했습니다. 이때 모든 미세먼지가 동시에 확산한다고 했으므로, 입력으로 주어진 미세먼지 양을 score에 저장해서 이는 확산 도중에 갱신되지 않도록 했습니다.
공기청정기의 위,아래 확산은 행렬의 인덱스를 활용해 문제에서 제시한 방법에 따라 구현했습니다.
T초간 반복 후 전체 방의 원소를 모두 더한 후 +2를 해주어 -1이 두 칸 있는 공기청정기는 무시하도록 했습니다.

 

# PyPy3로 통과 
import sys

dx = [-1,1,0,0]
dy = [0,0,-1,1]

# 미세먼지 위치 양 
def locate_dust(room, R, C):
	dust = []
	for i in range(R):
		for j in range(C):
			if room[i][j] > 0:
				dust.append((i,j,room[i][j]))
	return dust

# 미세먼지의 확산
def spread_dust(room,R,C,loc):
	x,y, score = loc
	count = 0
	for a,b in zip(dx,dy):
		if x+a in range(R) and y+b in range(C) and room[x+a][y+b] != -1:
			room[x+a][y+b] += score // 5
			count += 1
	room[x][y] -= score//5 * count
	return room

# 공기청정기 윗부분 확산 
def purifier_upper(room,R,C,loc):
	x,y = loc
	for i in range(x-1,0,-1): # ↓
		room[i][0] = room[i-1][0]
	for i in range(0,C-1): # ←
		room[0][i] = room[0][i+1]
	for i in range(0,x): # ↑
		room[i][C-1] = room[i+1][C-1]
	for i in range(C-1,1,-1): # →
		room[x][i] = room[x][i-1]
	room[x][1] = 0 # 미세먼지 없는 바람
	return room

# 공기청정기 아랫부분 확산 
def purifier_lower(room,R,C,loc):
	x,y = loc
	for i in range(x+1,R-1): # ↑
		room[i][0] = room[i+1][0]
	for i in range(0,C-1): # ←
		room[R-1][i] = room[R-1][i+1]
	for i in range(R-1, x, -1): # ↓
		room[i][C-1] = room[i-1][C-1]
	for i in range(C-1,1,-1): # →
		room[x][i] = room[x][i-1]
	room[x][1] = 0 # 미세먼지 없는 바람
	return room

R,C,T = map(int, sys.stdin.readline().split())

room = []
purifier = [] # 공기청정기의 위치 
for r in range(R):
	row = list(map(int, sys.stdin.readline().split()))
	room.append(row)
	if -1 in row:
		purifier.append((r, row.index(-1)))

# T초간 반복
now = 0
while now < T:
	locs = locate_dust(room, R, C)
	for loc in locs:
		room = spread_dust(room,R,C,loc)
	room = purifier_upper(room,R,C,purifier[0])
	room = purifier_lower(room,R,C,purifier[1])
	now += 1

# 공기청정기 -2는 더해주기
print(sum([sum(r) for r in room])+2)
반응형