17144 - 미세먼지 안녕!
2022. 5. 3. 14:04ㆍ2022/BaekJoon_삼성 SW 역량 테스트 기출
# 1. 미세먼지 확산
# 네방향으로 확산, 인접한 방향에 공기청정기가 있거나, 칸이 없으면 확산이 일어나지 않음
# 확산되는 양은 1/5(소수점 버림)
# 확산되고 남은 미세먼지 양은 A확산되고 남은 양
import copy
def spreadDust(graph):
cntList = [[0]*C for _ in range(R)]
addDustList = [[0]*C for _ in range(R)]
for r in range(R):
for c in range(C):
cnt = 0
dust = int(graph[r][c]//5)
if [r, c] not in cleanMac:
for i in range(4):
nx = r + dx[i]
ny = c + dy[i]
if 0<=nx<R and 0<=ny<C and ([nx, ny] not in cleanMac):
cnt += 1
addDustList[nx][ny]+=dust
cntList[r][c] = cnt
for r in range(R):
for c in range(C):
graph[r][c] += (addDustList[r][c]-(int(graph[r][c]//5) * cntList[r][c]))
return graph
# 2. 공기청정기 작동
# 위쪽 공기청정기의 바람은 반시계방향, 아래쪽 공기청정기의 바람은 시계방향
# 바람이 불면 미세먼지가 바람의 방향대로 모두 한칸씩 이동
# 공기청정기에서 부는 바람은 미세먼지가 없는 바람이고, 공기청정기로 들어간 미세먼지는 모두 정화
def moveAir(graph):
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
idx = -1; cx = cleanX; cy = 0
upTemp = copy.deepcopy(graph)[:cleanX+1][:]
upTemp[cx][cy] = -1
# 공기청정기 위 (가로 -> 세로 -> 가로 -> 세로)
for rc in [C, cleanX+1, C, cleanX+1]:
idx += 1
for _ in range(rc):
nx = cx+dx[idx]; ny = cy+dy[idx]
if 0 <= nx <= cleanX and 0 <= ny < C:
if nx == cleanX and ny ==0:
continue
elif nx == cleanX and ny == 1:
upTemp[nx][ny] = 0
else:
upTemp[nx][ny] = graph[cx][cy]
cx = nx; cy = ny
idx2 = 1; cx2 = cleanX+1; cy2 = 0
downTemp = copy.deepcopy(graph)[cleanX+1:][:]
downTemp[0][0] = -1
for rc in [C, R-cleanX-1, C, R-cleanX-1]:
idx2 -= 1; out = False
for _ in range(rc-1):
nx2 = cx2 + dx[idx2]; ny2 = cy2 + dy[idx2]
if 0 <= nx2 < R and 0 <= ny2 < C:
if nx2==(cleanX+1) and ny2 ==0:
continue
elif nx2 == (cleanX+1) and ny2 == 1:
downTemp[nx2-cleanX-1][ny2] = 0
else:
downTemp[nx2-cleanX-1][ny2] = graph[cx2][cy2]
cx2 = nx2; cy2 = ny2
else:
out = True
break
if out == True:
break
for rc in downTemp:
upTemp.append(rc)
return upTemp
if __name__ == '__main__':
R, C, T = map(int, input().split())
graph = []
cleanXT = []
for i in range(R):
temp = list(map(int, input().split()))
if -1 in temp:
cleanXT.append(i)
graph.append(temp)
cleanX = cleanXT[0]
cleanMac =[[cleanX, 0], [cleanX+1, 0]]
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
for _ in range(T):
firstStep = spreadDust(graph)
graph = moveAir(firstStep)
# 공기청소기 (-2)
result = 2
for r in range(R):
result += sum(graph[r])
print(result)
'2022 > BaekJoon_삼성 SW 역량 테스트 기출' 카테고리의 다른 글
20057 - 마법사 상어와 토네이도 (0) | 2022.05.03 |
---|---|
17822 - 원판 돌리기 (0) | 2022.05.03 |
16236 - 아기상어* (0) | 2022.05.03 |
14890 - 경사로* (0) | 2022.05.03 |
14889 - 스타트와 링크* (0) | 2022.05.03 |