[py] 17144_미세먼지 안녕!
Python/백준

[py] 17144_미세먼지 안녕!

728x90

 

2차원 구현 문제였다. 파이썬으로는 오랜만에 푸는 것 같다

 

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

 

 

문제에서 주어진 대로 따라가며 구현만 해주면 된다!

 

1. 확산하기

 

확산을 할 때 조금 헷갈릴 수 있다.

 

위와 같이 먼지들이 붙어있는 경우가 있는데 이때는 확산된 상태가 연동되며 미세먼지가 뿌려지는 것이 아닌 한번에 뿌려진다!!!

 

즉 이전 상태의 먼지 값에만 참조해서 확산을 해주면된다.

 

2. 청소하기

청소기가 작동하며 먼지들을 한칸씩 밀어내는 것을 구현하면 된다.

 

먼저 청소기의 상단, 하단을 구분해준 후 차례대로 하면 되는데 방향은 dr,dc를 인자로 받아서 해결하는 방식으로 구현해보았다.

확산과는 다르게 방향에 따른 우선순위가 있음으로 while문을 통하여 한바퀴만 돌도록 구현하였다.

 

조금 주의할 점은 처음에 공기를 밀어내주는 부분을 0으로 만들어줘야 한다는 점만 생각하면 될 것 같다.

 

 

 

 

r,c,t = list(map(int,input().split()))
map = [ list(map(int,input().split())) for _ in range(r)]

dr= [1,0,-1,0]
dc = [0,1,0,-1]

# 배열 내에서 갈 수 있는곳인지 파악
def isCanGo(row,col):
    return 0<=row and row < r and 0<= col and col < c and map[row][col] != -1

def spread(map):
    tmp = [ [0 for _ in range(c)] for __ in range(r)]

    for i in range(r):
        for j in range(c):
            if map[i][j] == -1: # 공기청정기라면 스킵
                tmp[i][j] = -1
                continue
            val = map[i][j] // 5 #확산될 먼지
            for d in range(4):
                nr = i + dr[d]
                nc = j + dc[d]
                if isCanGo(nr,nc):
                    tmp[nr][nc] += val
                    map[i][j] -= val
            tmp[i][j] += map[i][j]

    return tmp

def clean(row,col,dr,dc,map):
    tmp = [arr[:] for arr in map]
    row += dr[0]
    col += dc[0]
    tmp[row][col] = 0 # 처음으로 밀어낸 공기가 있는곳
    for d in range(4): # 4방향으로 한바퀴만 동작
        while 1:
            nr = row + dr[d]
            nc = col + dc[d]
            if isCanGo(nr,nc):
                tmp[nr][nc] = map[row][col]
                row = nr
                col = nc
            else : 
                break
    return tmp

machine = [] # 공기청정기 상단,하단 파악
for i in range(r):
    for j in range(c):
        if map[i][j] == -1:
            machine.append([i,j])


for time in range(t):

    map = spread(map)
    map = clean(machine[0][0],machine[0][1],[0,-1,0,1],[1,0,-1,0],map)
    map = clean(machine[1][0],machine[1][1],[0,1,0,-1],[1,0,-1,0],map)
   


ret = 0
for i in range(r):
    for j in range(c):
        if map[i][j] ==-1:
            continue
        ret += map[i][j]
print(ret)

 

 

 

 

 

 

728x90

'Python > 백준' 카테고리의 다른 글

[JS] 소가 길을 건너간 이유6  (0) 2024.02.24
16236_아기상어  (0) 2022.07.10
16235_나무제테크  (0) 2022.07.10
16234_인구이동  (0) 2022.07.07
5373_큐빙  (0) 2022.07.06