미세먼지 안녕
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!')