728x90
시뮬레이션 문제는 많~~~~~~~~~이 풀어봐야겠다
그나저나 청소년상어였던가 그것도 삼성기출인데 미세먼지 안녕이랑 비슷하게 빡 구현 (?) 이다.
난이도는 이게 그나마 아주조금 더 쉬운편
1. 먼지를 이동시킨다
다른 풀이를 참고했는데, 임의의 배열 공간(temp_array)을 만들어서, 그 배열을 이용해서 먼지를 상하좌우로 퍼뜨린것을 저장하고 원래의 배열로 옮기는 방법이다.
2. 공기청정기 가동 -> 위쪽 공기청정기의 x 좌표와 아래쪽 공기청정기 x 좌표를 경계로 전체 정사각형을 분할하여 생각한다.
그리고 벽면에 부딪힐 때 -> 즉 이동가능한 x, y 좌표의 범위를 벗어난 경우일 때, 방향을 차례대로 꺽어주면 된다 (반시계 방향 & 시계 방향)
칸은 원래 배열에 빈칸인 '0'을 앞쪽에서부터 삽입해서 나간다라고 생각하면 이후에 공기청정기칸으로 먼지가 이동할 때 먼지가 없어지는 것도 쉽게 해결할 수 있다 !!!!
그래서 before = 0 을 만든것이다.
그리고 before과 현재 확인중인 좌표인 array[x][y]를 바꿔주는 방식으로 한칸씩 밀려나도록 했다 !!
# 미세먼지안녕 17144
import sys
r, c, t = map(int, sys.stdin.readline().split())
array = []
up = -1 # x 좌표만 기록
down = -1
for i in range(r):
array.append(list(map(int, sys.stdin.readline().split())))
# 공기 청정기 x 좌표 찾기 ( y 좌표는 동일함 )
for i in range(r):
if array[i][0] == -1:
up = i
down = i + 1
break
# 마세먼지 이동 시키기
def dust():
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
temp_array = [[0]*c for _ in range(r)]
for i in range(r):
for j in range(c):
if array[i][j] > 0:
temp = 0
for k in range(4):
nx = i + dx[k]
ny = j + dy[k]
if 0 <= nx < r and 0 <= ny < c and array[nx][ny] != -1:
temp_array[nx][ny] += array[i][j]//5
temp += array[i][j]//5
array[i][j] -= temp
for i in range(r):
for j in range(c):
array[i][j] += temp_array[i][j]
def air_up():
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
x, y = up, 1
direct = 0
before = 0
while True:
if x == up and y == 0: # 공기 청정기 만남
break
nx = x + dx[direct]
ny = y + dy[direct]
if nx < 0 or nx >= r or ny < 0 or ny >= c:
direct += 1
continue
array[x][y], before = before, array[x][y]
x, y = nx, ny
def air_down():
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
x, y = down, 1
direct = 0
before = 0
while True:
if x == down and y == 0:
break
nx = x + dx[direct]
ny = y + dy[direct]
if nx < 0 or nx >= r or ny < 0 or ny >= c:
direct += 1
continue
array[x][y], before = before, array[x][y]
x, y = nx, ny
for _ in range(t):
dust()
air_up()
air_down()
result = 0
for i in range(r):
for j in range(c):
if array[i][j] > 0:
result += array[i][j]
print(result)
728x90
'Algorithm (PS)' 카테고리의 다른 글
[백준] 10819 in Python 차이를 최대로 (0) | 2022.02.17 |
---|---|
[백준] 1967 트리의 지름 : 다익스트라를 응용하자 ! (0) | 2022.02.16 |
[백준] 10610 in Python : 시간초과를 위해 Greedy를 떠올리자 (0) | 2022.02.15 |
[백준] 11660 구간 합구하기 -> 다이나믹 프로그래밍으로 효율적인 연산! (0) | 2022.02.13 |
[백준] 9466 텀프로젝트 : 다익스트라로 왕복하기 (0) | 2022.02.10 |