[백준 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)
* 틀린 부분이나 더 나은 방법이 있을 수 있습니다. 지적해주시면 감사하겠습니다!!
'posts' 카테고리의 다른 글
[백준 16235번] 나무 재테크 - Python으로 구현하기 (0) | 2019.10.19 |
---|---|
[백준 16236번] 아기 상어 - Python으로 구현하기 (0) | 2019.10.19 |
[백준 17143번] 낚시왕 - Python으로 구현하기 (1) | 2019.10.19 |
[백준 17140번] 이차원 배열과 연산 - Python으로 구현하기 (0) | 2019.10.18 |
[백준 17142번] 연구소 3 - Python으로 구현하기 (0) | 2019.10.18 |