728x90
📌 문제
https://www.acmicpc.net/problem/17144
📌 문제 접근 방법
- 단순 구현 문제! 문제가 시키는 대로 따라서 구현하면 된다.
- spread 함수를 만들어서 미세먼지가 퍼지도록 한다.
dust라는 배열을 따로 만들어서 각 위치의 먼지 변화량을 저장하고 원래 배열과 더해준다. - clean 함수를 만들어서 공기청정기를 가동시킨다.
공기청정기의 위치와 방향을 매개변수로 받아서 해당하는 방향대로 값을 swap해준다. - 2, 3의 과정을 T번만큼 반복 후, 배열의 합을 구해준다.
공기청정기는 -1로 표시되어 있으므로 2를 더해준다.
📌 코드
# 백준 17144 미세먼지 안녕!
def spread():
global arr
dust = [[0 for _ in range(C)] for _ in range(R)]
dij = [(1, 0), (-1, 0), (0, 1), (0, -1)]
for i in range(R):
for j in range(C):
if arr[i][j] > 0:
cnt = 0
move_dust = arr[i][j] // 5
for di, dj in dij:
ni, nj = i+di, j+dj
if 0 <= ni < R and 0 <= nj < C and arr[ni][nj] != -1:
dust[ni][nj] += move_dust
cnt += 1
dust[i][j] -= move_dust*cnt
for i in range(R):
for j in range(C):
arr[i][j] += dust[i][j]
def clean(m, dxy):
i = 0
nx = m
ny = 0
temp = 0
while i < 4:
nx += dxy[i][0]
ny += dxy[i][1]
if nx == m and ny == 0:
return
if 0 <= nx < R and 0 <= ny < C:
temp, arr[nx][ny] = arr[nx][ny], temp
else:
nx -= dxy[i][0]
ny -= dxy[i][1]
i += 1
R, C, T = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(R)]
machine = 0
for i in range(R):
if arr[i][0] == -1:
machine = i
break
for _ in range(T):
spread()
# 반시계방향
dxy = [(0, 1), (-1, 0), (0, -1), (1, 0)] # 오위왼아
clean(machine, dxy)
# 시계방향
dxy = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 오아왼위
clean(machine+1, dxy)
print(sum(map(sum, arr)) + 2)
728x90
'ALGORITHM > BAEKJOON' 카테고리의 다른 글
[BOJ/Python] 1197. 최소 스패닝 트리 (0) | 2021.10.21 |
---|---|
[BOJ/Python] 1717. 집합의 표현 (0) | 2021.10.21 |
[BOJ/Python] 14981. 톱니바퀴 (0) | 2021.10.14 |
[BOJ/Python] 17471. 게리맨더링 (0) | 2021.10.13 |
[BOJ/Python] 14503. 로봇 청소기 (0) | 2021.10.13 |
댓글