17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사
www.acmicpc.net
📝 풀이
- T초 동안 미세먼지의 확산과 순환이 반복적으로 일어나며 T초가 지난 후에 방에 남아있는 미세먼지의 양을 출력하는 문제
- 미세먼지 확산 알고리즘의 경우 확산과 동시에 원래 해당 칸에 있던 값이 덮어씌워지는 것을 방지하기 위해 임시로 리스트를 하나 더 생성하여 구현하였음
- 미세먼지 순환 알고리즘의 경우 공기청정기에 따른 순환 방향을 미리 정의해놓고 하나의 함수를 통해 해당 방향에 따라 미세먼지가 순환할 수 있도록 구현하였음
💻 소스코드
import sys
sys.stdin.readline
def spread():
dy = (1, -1, 0, 0)
dx = (0, 0, 1, -1)
tmp_room = [[0] * c for _ in range(r)]
for y in range(r):
for x in range(c):
if room[y][x] > 0:
tmp = 0
for k in range(4):
ny = y + dy[k]
nx = x + dx[k]
if 0 <= ny < r and 0 <= nx < c and room[ny][nx] != -1:
tmp_room[ny][nx] += room[y][x] // 5
tmp += room[y][x] // 5
room[y][x] -= tmp
for i in range(r):
for j in range(c):
room[i][j] += tmp_room[i][j]
def rotate(move, cleaner):
dir = prev = 0
y, x = cleaner, 1
while True:
ny = y + move[dir][0]
nx = x + move[dir][1]
if room[y][x] == -1:
break
if not 0 <= ny < r or not 0 <= nx < c: #맵 끝에 다다를 시 방향을 바꿈
dir += 1
continue
room[y][x], prev = prev, room[y][x]
y, x = ny, nx
def count():
result = 0
for i in range(r):
for j in range(c):
if room[i][j] > 0:
result += room[i][j]
return result
r, c, t = map(int, input().split())
room = [list(map(int, input().split())) for _ in range(r)]
up_move = ((0, 1), (-1, 0), (0, -1), (1, 0)) #위쪽 공기청정기 순환
down_move = ((0, 1), (1, 0), (0, -1), (-1, 0)) #아래쪽 공기청정기 순환
# 공기청정기 위치 확인
up = down = 0
for i in range(r):
if room[i][0] == -1:
up = i
down = i + 1
break
for _ in range(t):
spread() #미세먼지 확산
rotate(up_move, up) #시계방향 회전
rotate(down_move, down) #반시계방향 회전
print(count())
'🥇 Problem Solving > Simulation' 카테고리의 다른 글
[Python] BOJ / 1158번 / 요세푸스 문제 (0) | 2023.04.29 |
---|---|
[Python] BOJ / 1193번 / 분수찾기 (0) | 2023.04.28 |
[Python] BOJ / 15683번 / 감시 (0) | 2022.06.02 |
[Python] BOJ / 14891번 / 톱니바퀴 (0) | 2022.05.20 |
[Python] BOJ / 14499번 / 주사위 굴리기 (0) | 2022.05.05 |