728x90
문제 보기
이 문제는 시뮬레이션 문제이다.
문제에서 주어진 순서와 조건에 맞게 그대로 구현하면 된다.
순서는 미세먼지 확산, 공기청정기 작동 순서이며 조건은 미세먼지가 확산될 때 주의할 것이 있었다.
- 문제 접근
- 미세먼지 확산을 구현한 후 공기정청기를 구현하고자 하였다.
- 미세먼지 확산은 동시에 일어나기 때문에 두 개의 배열을 활용하고자 하였다.
- 확산이 일어나는 즉시 값을 업데이트하면 오류가 나기 때문이다. - 배열을 탐색하면서 배열 값이 5 이상인지 파악한다.
- 5 이상이면 상, 하, 좌, 우에 공기청정기가 있는지 탐색하고 확산을 진행한다. - 확산이 모두 끝난 후, 원래 배열 값에 확산 과정에서 따로 저장했던 배열 값들을 반영한다.
- 공기청정기는 상, 하 따로 관리한다.
- 상은 시계 방향, 하는 반시계 방향으로 순환시킨다.
- 알고리즘
- 문제 접근과 동일한 순서로 알고리즘을 작성하였다.
- 특별한 기술을 사용하지 않았으며, 배열을 최대한 활용하였다.
코드
# 공기청정기 위치 파악
def air_position():
for i in range(R):
if arr[i][0] == -1:
return [i, 0], [i + 1, 0] # 위, 아래 공기청정기 위치
# 미세먼지 이동
def dust_move():
temp = [[0] * C for _ in range(R)] # 확산값 저장
for i in range(R):
for j in range(C):
if arr[i][j] >= 5:
val = 0 # 얼마나 확산했는지
# 상
if i - 1 >= 0 and arr[i - 1][j] != -1:
temp[i - 1][j] += arr[i][j] // 5
val += arr[i][j] // 5
# 하
if i + 1 < R and arr[i + 1][j] != -1:
temp[i + 1][j] += arr[i][j] // 5
val += arr[i][j] // 5
# 좌
if j - 1 >= 0 and arr[i][j - 1] != -1:
temp[i][j - 1] += arr[i][j] // 5
val += arr[i][j] // 5
# 우
if j + 1 < C and arr[i][j + 1] != -1:
temp[i][j + 1] += arr[i][j] // 5
val += arr[i][j] // 5
temp[i][j] -= val # 확산값 빼기
for i in range(R):
for j in range(C):
arr[i][j] += temp[i][j] # 확산받은 값 더하기
def air_move():
# up
# 1 - 아래
temp = arr[up[0]][C - 1]
for i in range(C - 1, 1, - 1):
arr[up[0]][i] = arr[up[0]][i - 1]
arr[up[0]][1] = 0
# 2 - 오른쪽
temp_1 = arr[0][C - 1]
for i in range(up[0] - 1):
arr[i][C - 1] = arr[i + 1][C - 1]
arr[up[0] - 1][C - 1] = temp
# 3 - 위쪽
temp_2 = arr[0][0]
for i in range(C - 2):
arr[0][i] = arr[0][i + 1]
arr[0][C - 2] = temp_1
# 4 - 왼쪽
for i in range(up[0] - 1, 1, -1):
arr[i][0] = arr[i - 1][0]
arr[1][0] = temp_2
# down
# 1- 위쪽
temp = arr[down[0]][C - 1]
for i in range(C - 1, 1, -1):
arr[down[0]][i] = arr[down[0]][i - 1]
arr[down[0]][1] = 0
# 2 오른쪽
temp_1 = arr[R - 1][C - 1]
for i in range(R - 1, down[0] + 1, -1):
arr[i][C - 1] = arr[i - 1][C - 1]
arr[down[0] + 1][C - 1] = temp
# 3 - 아래쪽
temp_2 = arr[R - 1][0]
for i in range(C - 2):
arr[R - 1][i] = arr[R - 1][i + 1]
arr[R - 1][C - 2] = temp_1
# 4 - 왼쪽
for i in range(down[0] + 1, R - 1):
arr[i][0] = arr[i + 1][0]
arr[R - 2][0] = temp_2
if __name__ == "__main__":
# input
R, C, T = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(R)]
# 공기청정기 위치 가져오기
up, down = air_position()
# T시간 동안 시뮬레이션
for i in range(T):
dust_move() # 미세먼지 이동
air_move() # 공기청정기 작동
total = 0
for i in range(R):
for j in range(C):
if arr[i][j] > 0:
total += arr[i][j]
print(total)
728x90
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[ 백준 15684 ] 사다리 조작 - Python (0) | 2020.06.18 |
---|---|
[ 백준 9446 ] 텀 프로젝트 - Python (0) | 2020.06.16 |
[ 백준 9252 ] LCS 2 - Python (0) | 2020.06.14 |
[ 백준 2589 ] 보물섬 - Python (4) | 2020.06.11 |
[ 백준 16234 ] 인구 이동 - Python (0) | 2020.06.10 |