https://www.acmicpc.net/problem/17144
✅ Solution
- 단순한 구현 문제이다. 그런데 공기청정기 동작 구현이 좀 어려워서 찾아봤다.
- 먼저 확산의 경우, 상하좌우를 체크해서 범위 내에 있고 공기청정기의 위치가 아닐 때 확산되는 양을 더해준다.
- 그리고 그만큼의 양을 원래 양에서 빼준다.
- 다음으로 공기청정기 동작은 시계방향, 반시계방향을 따로 처리해 줬다.
- 방향대로 쭉 밀어서 위치하도록 한다.
- 위의 과정을 t번만큼 반복하고 미세먼지의 양을 모두 더해주면 된다.
✅ Code
import sys
input = sys.stdin.readline
def diffuse():
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# 확산은 동시에 일어나기 때문에 따로 배열은 선언 후 마지막에 한번에 처리해준다.
diffused = [[0] * c for _ in range(r)]
for x in range(r):
for y in range(c):
if data[x][y] <= 0:
continue
dust = data[x][y] // 5
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
# 범위 내에 있고 공기 청정기의 위치가 아닐 때
if 0 <= nx < r and 0 <= ny < c and data[nx][ny] != -1:
diffused[nx][ny] += dust
diffused[x][y] -= dust
# 확산된 양 반영
for x in range(r):
for y in range(c):
data[x][y] += diffused[x][y]
# 시계 방향
def clean_dust_up():
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
x, y, direction = m1, 1, 0
prev = 0
while True:
nx = x + dx[direction]
ny = y + dy[direction]
# 방향대로 모두 한칸씩 미뤘을 때
if x == m1 and y == 0:
break
if 0 > nx or nx >= r or 0 > ny or ny >= c:
direction += 1
continue
data[x][y], prev = prev, data[x][y]
x, y = nx, ny
# 반시계 방향
def clean_dust_down():
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
x, y, direction = m2, 1, 0
prev = 0
while True:
nx = x + dx[direction]
ny = y + dy[direction]
# 방향대로 모두 한칸씩 미뤘을 때
if x == m2 and y == 0:
break
if 0 > nx or nx >= r or 0 > ny or ny >= c:
direction += 1
continue
data[x][y], prev = prev, data[x][y]
x, y = nx, ny
r, c, t = map(int, input().split())
data = [list(map(int, input().split())) for _ in range(r)]
answer = 0
# 공기청정기의 위치
for i in range(r):
if data[i][0] == -1:
m1 = i
m2 = i + 1
break
for _ in range(t):
diffuse()
clean_dust_up()
clean_dust_down()
for i in range(r):
for j in range(c):
if data[i][j] > 0:
answer += data[i][j]
print(answer)
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 21608번: 상어 초등학교 (Python) (2) | 2023.04.05 |
---|---|
[백준] 14499번: 주사위 굴리기 (Python) (0) | 2023.04.03 |
[백준] 15685번: 드래곤 커브 (Python) (0) | 2023.03.27 |
[백준] 14891번: 톱니바퀴 (Python) (0) | 2023.03.27 |
[백준] 11404번: 플로이드 (0) | 2023.03.07 |