1. 문제
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사
www.acmicpc.net
2. 접근 방법
구현, 시뮬레이션 문제라서 문제에서 제시한 대로 따라가면 된다.
크게 2개를 구현하면 된다.
1. 미세먼지 확산
2. 공기청정기 작동
3. 코드
python
def clean():
global board
y1, y2 = cleaner[0], cleaner[1]
for y in range(y1-2, -1, -1):
board[y+1][0] = board[y][0]
for x in range(1, C):
board[0][x-1] = board[0][x]
for y in range(1, y1+1):
board[y-1][C-1] = board[y][C-1]
for x in range(C-2, 0, -1):
board[y1][x+1] = board[y1][x]
for y in range(y2+1, R):
board[y-1][0] = board[y][0]
for x in range(1, C):
board[R-1][x-1] = board[R-1][x]
for y in range(R-2, y2-1, -1):
board[y + 1][C - 1] = board[y][C - 1]
for x in range(C-2, 0, -1):
board[y2][x + 1] = board[y2][x]
def spread():
global board, dx, dy
add_dust = [[0] * C for _ in range(R)]
for y in range(R):
for x in range(C):
if board[y][x] >= 5:
add_dust_num = board[y][x]//5
for i in range(4):
tx, ty = x+dx[i], y+dy[i]
if 0 <= tx < C and 0 <= ty < R and board[ty][tx] != -1:
add_dust[ty][tx] += add_dust_num
add_dust[y][x] -= add_dust_num
return add_dust
R, C, T = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(R)]
cleaner = []
dx, dy = (1, 0, -1, 0), (0, 1, 0, -1)
for y in range(R):
if board[y][0] == -1:
cleaner.append(y)
for _ in range(T):
dust = []
temp = spread()
for y in range(R):
for x in range(C):
board[y][x] += temp[y][x]
clean()
board[cleaner[0]][1] = 0
board[cleaner[1]][1] = 0
board[cleaner[0]][0] = -1
board[cleaner[1]][0] = -1
ans = 0
for y in range(len(board)):
ans += sum(board[y])
ans += 2
print(ans)
4. 마치며
공기 청정기 작동에서 인덱스가 자꾸 헷갈려서 엄청난 디버깅을 했다.
o(一︿一+)o
'Algorithm > Python' 카테고리의 다른 글
[백준 17140] 이차원 배열과 연산 (0) | 2021.04.20 |
---|---|
[백준 17143] 낚시왕 (0) | 2021.04.20 |
[백준 16234] 인구 이동 (0) | 2021.04.19 |
[백준 5373] 큐빙 (0) | 2021.04.19 |
[백준 15683] 감시 (0) | 2021.04.18 |