[백준] 17144 미세먼지 안녕! (Python 파이썬)

dh·2022년 10월 23일
0
post-thumbnail

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

접근방법

먼지의 확산을 적용하고 공기청정기의 위,아래를 나누어 구현했다.
공기청정기에서 배열의 테두리를 회전하는 부분이 어려웠다.

코드

r,c,t = map(int,input().split())
room = []
for i in range(r):
    room.append(list(map(int,input().split())))
dx = [0,0,1,-1]
dy = [1,-1,0,0]

clock = 0
reverse =0



def difuse(x,y):
    cnt = 0
    for k in range(4):
        nx = x + dx[k]
        ny = y + dy[k]
        if 0<=nx<r and 0<=ny<c:
            if room[nx][ny]!=-1:
                cnt += 1
                temp[nx][ny] = temp[nx][ny] + room[x][y]//5

    room[x][y] = room[x][y] - room[x][y]//5 * cnt


for _ in range(t):
    temp = [[0 for _ in range(c)] for _ in range(r)]

    #확산값 임시
    for i in range(r):
        for j in range(c):
            if room[i][j] >0:
                difuse(i,j)
    #확산값 적용
    for x in range(r):
        for y in range(c):
            if room[x][y]==-1:
                if clock == 0:
                    clock = x
                elif clock != 0 and reverse == 0:
                    reverse = x
            room[x][y] = room[x][y] + temp[x][y]


    #공기청정기 위 반시계방향
    # → → → → → → →
    RB = room[clock][c-1]
    for j in range(c-1,0,-1):
        room[clock][j] = room[clock][j-1]
        if room[clock][j]<0:
            room[clock][j]=0
    # # ↑ ↑ ↑ ↑ ↑
    RT = room[0][c - 1]
    for k in range(clock):
        room[k][c-1] = room[k+1][c-1]
        if k==clock-1:
            room[k][c-1] = RB
    # ← ← ← ← ← ←
    LT = room[0][0]
    for j in range(c-1):
        room[0][j] = room[0][j+1]
        if j==c-2:
            room[0][j] = RT
    # ↓ ↓ ↓ ↓ ↓ ↓
    for j in range(clock-1,0,-1):
        room[j][0] = room[j-1][0]
        if j==1:
            room[j][0] = LT


    #공기청정기 아래 시계
    RT = room[reverse][c-1]
    for j in range(c-1,0,-1):
        # → → → → → → →
        room[reverse][j] = room[reverse][j-1]
        if room[reverse][j]<0:
            room[reverse][j]=0
    # ↓ ↓ ↓ ↓ ↓ ↓
    RB = room[r-1][c-1]
    for j in range(r-1, reverse, -1):
        room[j][c-1] = room[j - 1][c-1]
        if j == reverse+1:
            room[j][c-1] = RT
    # ← ← ← ← ← ←
    LB = room[r-1][0]
    for j in range(c-1):
        room[r-1][j] = room[r-1][j+1]
        if j==c-2:
            room[r-1][j] = RB
    # # ↑ ↑ ↑ ↑ ↑
    for k in range(reverse+1,r-1):
        room[k][0] = room[k + 1][0]
        if k == r - 2:
            room[k][0] = LB

ans = 0
for i in range(r):
    ans += sum(room[i])

print(ans+2)

0개의 댓글