문제풀이/구현

● [파이썬] [구현] 백준 17144 미세먼지 안녕!

승무_ 2023. 3. 29. 23:55

문제

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

 

17144번: 미세먼지 안녕!

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

www.acmicpc.net

코드

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

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

for i in range(r):
    if array[i][0]==-1:
        #ur: 청정기 위쪽 row
        ur=i
        dr=i+1
        break

def spread():
    # 동시에 확산되므로 temp 사용
    temp = [[0]*c for _ in range(r)]
    for i in range(r):
        for j in range(c):
            if array[i][j]!=0 and array[i][j]!=-1:
                count=0
                for k in range(4):
                    nx=i+dx[k]
                    ny=j+dy[k]
                    if 0<=nx<r and 0<=ny<c:
                        if array[nx][ny]!=-1:
                            temp[nx][ny]+=(array[i][j]//5)
                            count+=1
                array[i][j]-=((array[i][j]//5)*count)
    for i in range(r):
        for j in range(c):
            array[i][j]+=temp[i][j]
def work():
    temp=array[ur][1]
    for i in range(c-1):
        temp,array[ur][i+1]=array[ur][i+1],temp
    for i in range(ur,0,-1):
        temp,array[i-1][c-1]=array[i-1][c-1],temp
    for i in range(c-1,0,-1):
        temp,array[0][i-1]=array[0][i-1],temp
    for i in range(ur-1):
        temp,array[i+1][0]=array[i+1][0],temp
    array[ur][1]=0
    temp = array[dr][1]
    for i in range(c-1):
        temp,array[dr][i+1]=array[dr][i+1],temp
    for i in range(dr,r-1):
        temp,array[i+1][c-1]=array[i+1][c-1],temp
    for i in range(c-1,0,-1):
        temp,array[r-1][i-1]=array[r-1][i-1],temp
    for i in range(r-1,dr+1,-1):
        temp,array[i-1][0]=array[i-1][0],temp
    array[dr][1] = 0

for _ in range(t):
    spread()
    work()

result=0
for i in range(r):
    for j in range(c):
        if array[i][j]!=-1:
            result+=array[i][j]
print(result)

생각 정리

def air_up():
    dx = [0, -1, 0, 1]
    dy = [1, 0, -1, 0]
    direct = 0
    before = 0
    x, y = up, 1
    while True:
        nx = x + dx[direct]
        ny = y + dy[direct]
        if x == up and y == 0:
            break
        if nx < 0 or nx >= r or ny < 0 or ny >= c:
            direct += 1
            continue
        arr[x][y], before = before, arr[x][y]
        x = nx
        y = ny

좀 더 깔끔하게 수정 가능