Algorithm (PS)

[백준/삼성기출] 17144 미세먼지 안녕! - 구현구현구현문제

minjiwoo 2022. 2. 15. 10:54
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