본문 바로가기

알고리즘/삼성 기출

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

문제

 

https://www.acmicpc.net/problem/17144

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

 

내 풀이

 

문제에서 말하는 순서대로 구현하였다.

미세먼지를 먼저 확산시키고 -> 공기청정기를 작동시켰다.

 

풀 때 가장 중요한 것은, 중간중간 코드가 맞는지 결과를 프린트해보는 것이다.

 

공기청정기를 구현할 때에는 좀 더 머리를 써볼까 생각도 했지만, 짧은 시간 안에 빨리 푸는 연습을 하느라 그냥 생각나는 대로 풀었다.

공기청정기가 닿는 미세먼지들의 좌표를 배열에 다 담고, 그 배열에서 한 칸씩 옮기는 작업을 하였다.

좀 단순한 풀이라는 단점이 있지만, 머리가 안 돌아갈 때 금방 쓸 수 있다는 장점이 있다.

 

import copy

R, C, T = map(int, input().strip().split())
A, air = [], []
for i in range(R):
    A.append(list(map(int, input().strip().split())))
    for j in range(C):
        if A[i][j] == -1:
            air.append((i, j))
            
dx, dy = [-1, 1, 0, 0], [0, 0, 1, -1]
for _ in range(T):
    later_A = [[0]*C for _ in range(R)]
    # 미세먼지 확산
    for i in range(R):
        for j in range(C):
            if 0 < A[i][j]:
                cnt = 0
                x, y = i, j
                for k in range(4):
                    nx, ny = x+dx[k], y+dy[k]
                    if 0<=nx<R and 0<=ny<C and A[nx][ny] != -1:
                        later_A[nx][ny] += A[i][j]//5
                        cnt += 1
                A[i][j] -= (A[i][j]//5)*cnt
    for i in range(R):
        for j in range(C):
            if 0 < A[i][j]:
                later_A[i][j] += A[i][j]
            if A[i][j] == -1:
                later_A[i][j] = -1
    # 공기청정기 작동
    for k in range(2):
        if k == 0:
            arr = []
            x, y = air[k]
            for j in range(1, C): arr.append((x, j))
            for i in range(x-1, -1, -1): arr.append((i, C-1))
            for j in range(C-2, -1, -1): arr.append((0, j))
            for i in range(1, x): arr.append((i, 0))
            
            for i in range(len(arr)-1, 0, -1):
                lx, ly = arr[i]
                px, py = arr[i-1]
                later_A[lx][ly] = later_A[px][py]
                later_A[px][py] = 0
        elif k == 1:
            arr = []
            x, y = air[k]
            for j in range(1, C): arr.append((x, j))
            for i in range(x+1, R): arr.append((i, C-1))
            for j in range(C-2, -1, -1): arr.append((R-1, j))
            for i in range(R-2, x, -1): arr.append((i, 0))
            
            for i in range(len(arr)-1, 0, -1):
                lx, ly = arr[i]
                px, py = arr[i-1]
                later_A[lx][ly] = later_A[px][py]
                later_A[px][py] = 0
    A = copy.deepcopy(later_A)
ans = 0
for i in range(R):
    for j in range(C):
        if 0 < A[i][j]:
            ans += A[i][j]
print(ans)

 

다른 풀이

 

다른 풀이에서 공기청정기를 돌릴 때 while문과 dx, dy 배열을 사용하였다.

내 풀이가 많이 무식한 줄 알았더니, 원리는 똑같은 것 같다.

시뮬레이션이라 이렇게 풀 수 밖에 없는 것 같기도 하다.

 

총평

미세먼지는 하드코딩이 지배한다!