백준 미세먼지 안녕! 코드 및 해설 (파이썬)
2021. 11. 3. 13:34ㆍalgorithm
반응형
https://www.acmicpc.net/problem/17144
미세먼지의 양과 그 위치를 확인하는 함수, 미세먼지의 확산을 구현하는 함수, 공기청정기의 윗부분과 아랫부분의 확산을 구현하는 함수를 만들어 매 초마다 이 함수들을 실행해주었습니다.
미세먼지의 양과 위치를 확인하는 함수는 전체 방의 원소를 확인하면서 원소가 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)
반응형
'algorithm' 카테고리의 다른 글
백준 포도주 시식 코드 및 해설 (파이썬) (0) | 2021.11.09 |
---|---|
백준 컨베이어 벨트 위의 로봇 코드 및 해설 (파이썬) (0) | 2021.11.08 |
백준 색종이 코드 및 해설 (파이썬) (0) | 2021.11.03 |
프로그래머스 모음사전 코드 및 해설 (파이썬) (0) | 2021.11.03 |
백준 1로 만들기 코드 및 해설 (파이썬) (0) | 2021.10.28 |