[백준 17144번] 미세먼지 안녕! - Python으로 구현하기

 

문제 접근

  • 주어진 순서대로 확산 -> 순환 과정을 구현하면 된다.
  • 확산 과정 : 임의 tmp 배열에 확산된 값을 저장하고(동시에 확산하기 때문에) 확산이 끝나면 기존 미세먼지값에 업데이트 해준다. 또한, 주어진 수식에 따라 확산양*확산된 곳 개수 을 빼준다.
  • 순환 과정 : 배열의 테두리를 돌려야한다. 임의 tmp 배열 하나를 생성해두어 간단하게 처리 가능하다.(모서리부분 주의)

 

생각해볼 점

  • 배열 테두리를 돌리는데 더 나은 방법?

 

R,C,T=map(int,input().split())
A = [list(map(int,input().split())) for _ in range(R)]
di = [[-1,0],[0,-1],[1,0],[0,1]]
time = 0
while time<T:
    # 미세먼지 확산
    tmp_A = [[0] * C for _ in range(R)]
    for i in range(R):
        for j in range(C):
            if A[i][j]>0:
                cnt = 0
                for k in range(4):
                    ni=i+di[k][0]
                    nj=j+di[k][1]
                    if 0<=ni<R and 0<=nj<C and A[ni][nj]!=-1:
                        tmp_A[ni][nj]+=(A[i][j]//5)
                        cnt+=1
                A[i][j]=A[i][j]-(A[i][j]//5)*cnt

    # 기존 A와 확산 미세먼지 합치기
    for i in range(R):
        for j in range(C):
            A[i][j]+=tmp_A[i][j]

    # 공기청정기 순환
    tmp_A = [[-2] * C for _ in range(R)]
    up_machine_row=0
    for row in range(R):
        if A[row][0]==-1:
            up_machine_row=row
            break
    # 위쪽
    for i in range(1,C):
        tmp_A[0][i-1]=A[0][i]
        tmp_A[up_machine_row][i]=A[up_machine_row][i-1]
        tmp_A[up_machine_row][1]=0
    for i in range(1,up_machine_row+1):
        if A[i][0]!=-1:
            tmp_A[i][0]=A[i-1][0]
        tmp_A[i-1][C-1]=A[i][C-1]


    # 아래쪽
    for i in range(1,C):
        tmp_A[R-1][i-1]=A[R-1][i]
        tmp_A[up_machine_row+1][i]=A[up_machine_row+1][i-1]
        tmp_A[up_machine_row+1][1]=0
    for i in range(up_machine_row+2,R):
        if A[i-1][0]!=-1:
            tmp_A[i-1][0]=A[i][0]
        tmp_A[i][C-1]=A[i-1][C-1]

    for i in range(R):
        for j in range(C):
            if tmp_A[i][j]!=-2:
                A[i][j]=tmp_A[i][j]
    time+=1

print(sum(list(sum(A,[])))+2)

 

* 틀린 부분이나 더 나은 방법이 있을 수 있습니다. 지적해주시면 감사하겠습니다!!

+ Recent posts