알고리즘 풀이/백준

[ 백준 17144 ] 미세먼지 안녕! - Python

12.tka 2020. 6. 15. 20:30
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