알고리즘
[알고리즘] 미세먼지 안녕 - bfs/구현
j9972
2024. 3. 22. 12:57
728x90
문제
https://www.acmicpc.net/problem/17144
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사
www.acmicpc.net
풀이
1. 조건이 복잡하지 않아서 따라 하기만 하면 된다.
2. 고민할만한 점은 공기청정기가 직사각형의 둘레를 따라 시계 / 반시계 방향으로 바람이 분다는점이다.
- 범위를 벗어날때 direct를 변경해주면 된다.
- 앞의 내용과 이전의 내용을 바꿔주면 된다
코드
import sys
n,m,t = map(int,input().split())
up,down = -1,-1
# 시계방향
dxs,dys = [0,-1,0,1],[1,0,-1,0]
# 반시계방향
dxss,dyss = [0,1,0,-1],[1,0,-1,0]
arr = [
list(map(int,input().split()))
for _ in range(n)
]
tmp = [
[0 for _ in range(m)]
for _ in range(n)
]
for i in range(n):
if arr[i][0] == -1:
up = i
down = i+1
break
def init_tmp():
for i in range(n):
for j in range(m):
tmp[i][j] = 0
def in_range(x,y):
return 0<=x<n and 0<=y<m
def dirty_can_go(x,y):
return in_range(x,y) and arr[x][y] != -1
def dirty_wind():
init_tmp()
for x in range(n):
for y in range(m):
if arr[x][y] == 0 or arr[x][y] == -1:
continue
dirty_cnt = 0
for dx,dy in zip(dxs,dys):
nx,ny = x + dx, y + dy
if dirty_can_go(nx,ny):
tmp[nx][ny] += arr[x][y] // 5
dirty_cnt += 1
arr[x][y] -= (arr[x][y] // 5 * dirty_cnt)
for x in range(n):
for y in range(m):
arr[x][y] += tmp[x][y]
def air_up():
before, direct = 0,0
x,y = up,0
while True:
nx,ny = x + dxs[direct],y + dys[direct]
if x == up and y == 0:
break
if not in_range(nx,ny):
direct += 1
continue
arr[x][y], before = before, arr[x][y]
x,y = nx,ny
def air_down():
before, direct = 0,0
x,y = down,0
while True:
nx,ny = x + dxss[direct],y + dyss[direct]
if x == down and y == 0:
break
if not in_range(nx,ny):
direct += 1
continue
arr[x][y], before = before, arr[x][y]
x,y = nx,ny
for _ in range(t):
dirty_wind()
air_up()
air_down()
tot_dirty = 0
for i in range(n):
for j in range(m):
if arr[i][j] >= 1:
tot_dirty += arr[i][j]
print(tot_dirty)