17144 - 미세먼지 안녕!

2022. 5. 3. 14:042022/BaekJoon_삼성 SW 역량 테스트 기출

# 1. 미세먼지 확산
# 네방향으로 확산, 인접한 방향에 공기청정기가 있거나, 칸이 없으면 확산이 일어나지 않음
# 확산되는 양은 1/5(소수점 버림)
# 확산되고 남은 미세먼지 양은 A확산되고 남은 양
import copy

def spreadDust(graph):
    cntList = [[0]*C for _ in range(R)]
    addDustList = [[0]*C for _ in range(R)]
    for r in range(R):
        for c in range(C):
            cnt = 0
            dust = int(graph[r][c]//5)
            if [r, c] not in cleanMac:
                for i in range(4):
                    nx = r + dx[i]
                    ny = c + dy[i]
                    if 0<=nx<R and 0<=ny<C and ([nx, ny] not in cleanMac):
                        cnt += 1
                        addDustList[nx][ny]+=dust
                cntList[r][c] = cnt

    for r in range(R):
        for c in range(C):
            graph[r][c] += (addDustList[r][c]-(int(graph[r][c]//5) * cntList[r][c]))
    return graph

# 2. 공기청정기 작동
# 위쪽 공기청정기의 바람은 반시계방향, 아래쪽 공기청정기의 바람은 시계방향
# 바람이 불면 미세먼지가 바람의 방향대로 모두 한칸씩 이동
# 공기청정기에서 부는 바람은 미세먼지가 없는 바람이고, 공기청정기로 들어간 미세먼지는 모두 정화
def moveAir(graph):
    dx = [0, -1, 0, 1]
    dy = [1, 0, -1, 0]
    idx = -1; cx = cleanX; cy = 0
    upTemp = copy.deepcopy(graph)[:cleanX+1][:]
    upTemp[cx][cy] = -1
    # 공기청정기 위 (가로 -> 세로 -> 가로 -> 세로)
    for rc in [C, cleanX+1, C, cleanX+1]:
        idx += 1
        for _ in range(rc):
            nx = cx+dx[idx]; ny = cy+dy[idx]
            if 0 <= nx <= cleanX and 0 <= ny < C:
                if nx == cleanX and ny ==0:
                    continue
                elif nx == cleanX and ny == 1:
                    upTemp[nx][ny] = 0
                else:
                    upTemp[nx][ny] = graph[cx][cy]
                cx = nx; cy = ny

    idx2 = 1; cx2 = cleanX+1; cy2 = 0
    downTemp = copy.deepcopy(graph)[cleanX+1:][:]
    downTemp[0][0] = -1
    for rc in [C, R-cleanX-1, C, R-cleanX-1]:
        idx2 -= 1; out = False
        for _ in range(rc-1):
            nx2 = cx2 + dx[idx2]; ny2 = cy2 + dy[idx2]
            if 0 <= nx2 < R and 0 <= ny2 < C:
                if nx2==(cleanX+1) and ny2 ==0:
                    continue
                elif nx2 == (cleanX+1) and ny2 == 1:
                    downTemp[nx2-cleanX-1][ny2] = 0
                else:
                    downTemp[nx2-cleanX-1][ny2] = graph[cx2][cy2]
                cx2 = nx2; cy2 = ny2
            else:
                out = True
                break
        if out == True:
            break

    for rc in downTemp:
        upTemp.append(rc)

    return upTemp

if __name__ == '__main__':
    R, C, T = map(int, input().split())
    graph = []
    cleanXT = []
    for i in range(R):
        temp = list(map(int, input().split()))
        if -1 in temp:
            cleanXT.append(i)
        graph.append(temp)
        
    cleanX = cleanXT[0]
    cleanMac =[[cleanX, 0], [cleanX+1, 0]]

    dx = [1, 0, -1, 0]
    dy = [0, 1, 0, -1]

    for _ in range(T):
        firstStep = spreadDust(graph)
        graph = moveAir(firstStep)

    # 공기청소기 (-2)
    result = 2
    for r in range(R):
        result += sum(graph[r])
    print(result)

'2022 > BaekJoon_삼성 SW 역량 테스트 기출' 카테고리의 다른 글

20057 - 마법사 상어와 토네이도  (0) 2022.05.03
17822 - 원판 돌리기  (0) 2022.05.03
16236 - 아기상어*  (0) 2022.05.03
14890 - 경사로*  (0) 2022.05.03
14889 - 스타트와 링크*  (0) 2022.05.03