미세먼지 안녕


for문만 엄청 사용해 푼 문제여서, 풀긴 풀었지만 뭔가 찜찜함이 남아있다.

[다시 풀어보기]


CODE

import sys
read=sys.stdin.readline

r,c,t=map(int,read().split())
dust=list(list(map(int,read().split())) for _ in range(r))

d=[]
for i in range(r):
    if dust[i][0]==-1: d.append(i)
dx=[0,1,0,-1]
dy=[1,0,-1,0]

def diffusion():
    add=list(list(0 for _ in range(c)) for _ in range(r))
    for i in range(r):
        for j in range(c):

            if dust[i][j]>0:
                cnt=0
                for x,y in zip(dx,dy):
                    ix=i+x
                    jy=j+y
                    if 0<=ix<r and 0<=jy<c and dust[ix][jy]!=-1:
                        add[ix][jy]+=dust[i][j]//5
                        cnt+=1
                dust[i][j]-=(dust[i][j]//5)*cnt
    for i in range(r):
        for j in range(c):
            dust[i][j]+=add[i][j]
    return

def cycle():
    #1
    for i in range(d[0]-1,0,-1):
        dust[i][0]=dust[i-1][0]
    for i in range(d[1]+1,r-1):
        dust[i][0]=dust[i+1][0]
    #2
    for i in range(c-1):
        dust[0][i]=dust[0][i+1]
        dust[-1][i]=dust[-1][i+1]
    #3
    for i in range(d[0]):
        dust[i][-1]=dust[i+1][-1]
    for i in range(r-1,d[1],-1):
        dust[i][-1]=dust[i-1][-1]
    #4
    for i in range(c-1,1,-1):
        dust[d[0]][i]=dust[d[0]][i-1]
        dust[d[1]][i]=dust[d[1]][i-1]
    dust[d[0]][1]=0
    dust[d[1]][1]=0

    return

for _ in range(t):
    diffusion()
    cycle()

sum_dust=2
for D in dust:
    sum_dust+=sum(D)

print(sum_dust)



상범 빌딩

3차원 BFS문제다. 오늘 문제들은 한번에 수월하게 풀려서 비교적 편했다.


CODE

import sys
read=sys.stdin.readline
from collections import deque

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

while True:
    #0,0,0이 입력되기 전까지 계속 반복
    l,r,c=map(int,read().split())
    if l==0 and r==0 and c==0: break
    B=[]
    for _ in range(l):
        tmp=list(list(read().strip()) for _ in range(r))
        B.append(tmp)
        tmp=read()

    point=deque([])
    end_point=[]
    #시작점과 끝나는점 탐색
    for k in range(l):
        for i in range(r):
            for j in range(c):
                if B[k][i][j]=='S':
                    point.append([k,i,j])
                    B[k][i][j]=0
                elif B[k][i][j]=='E':
                    end_point=[k,i,j]
                    B[k][i][j]='.'
                    #끝나는 지점은 end_point에 따로 저장한 후에
                    #다른 이동가능한 점들과 똑같이 '.'으로 변경해준다.

    flag=2#도착지점에 도착했을 때 아래의 while문을 탈출하기 위한 flag
    while point:
        if flag==1:break
        a,b,q=point.popleft()
        for x,y,z in zip(dx,dy,dz):
            ax,by,qz=a+x,b+y,q+z
            if 0<=ax<l and 0<=by<r and 0<=qz<c and B[ax][by][qz]==".":
                point.append([ax,by,qz])
                B[ax][by][qz]=B[a][b][q]+1
                if [ax,by,qz]==end_point:
                    print('Escaped in ',B[ax][by][qz],' minute(s).',sep="")
                    flag=1
    #flag 가 그대로 2인 상태로 남아있다면 도착지점에 도착하지 못했다는 뜻이다.
    if flag==2: print('Trapped!')