코딩테스트
[백준] 17144번 : 미세먼지 안녕! - 파이썬
청담동누룽이
2023. 4. 8. 22:52
아이디어 : 구현, 4방위 탐색, 배열 돌리기
나의 답안
import sys
input = sys.stdin.readline
R, C, T = map(int, input().split())
graph=[]
for _ in range(R):
graph.append(list(map(int, input().split())))
for i in range(R):
if graph[i][0] == -1:
machine_up = i
machine_down = i + 1
break
dy = [1, 0, -1, 0]
dx = [0, -1, 0, 1]
def spread():
global graph
temp = [[0 for _ in range(C)] for _ in range(R)]
for r in range(R):
for c in range(C):
spread_amount = 0
if graph[r][c] == -1:
continue
for i in range(4):
gr = r + dy[i]
gc = c + dx[i]
# 경계 & 공기 청정기
if 0 <= gr < R and 0 <= gc < C and graph[gr][gc] != -1:
temp[gr][gc] = temp[gr][gc] + graph[r][c] // 5
spread_amount = spread_amount + graph[r][c] // 5
temp[r][c] = temp[r][c] + (graph[r][c] - spread_amount)
graph = temp[:]
graph[machine_up][0] = -1
graph[machine_down][0] = -1
# DEBUG
# print("spread")
# for i in range(R):
# print(graph[i])
return True
def spin():
# 위 - 반시계
prev_graph = graph[machine_up][1]
graph[machine_up][1] = 0
# 하
for i in range(1, C-1):
temp = graph[machine_up][i+1]
graph[machine_up][i+1] = prev_graph
prev_graph = temp
# 우
for i in range(1, machine_up+1):
temp = graph[machine_up - i][C-1]
graph[machine_up - i][C-1] = prev_graph
prev_graph = temp
# 상
for i in range(1, C):
temp = graph[0][(C-1) - i]
graph[0][(C-1) - i] = prev_graph
prev_graph = temp
# 좌
for i in range(1, machine_up):
temp = graph[i][0]
graph[i][0] = prev_graph
prev_graph = temp
# DEBUG
# print("spin up")
# for i in range(R):
# print(graph[i])
# 아래 - 시계
prev_graph = graph[machine_down][1]
graph[machine_down][1] = 0
# 상
for i in range(1, C-1):
temp = graph[machine_down][i+1]
graph[machine_down][i+1] = prev_graph
prev_graph = temp
# 우
for i in range(machine_down+1, R):
temp = graph[i][C-1]
graph[i][C-1] = prev_graph
prev_graph = temp
# 하 - ?
for i in range(1, C):
temp = graph[R-1][(C-1) - i]
graph[R-1][(C-1) - i] = prev_graph
prev_graph = temp
# 좌
for i in range(1, R-(machine_down+1)):
temp = graph[(R-1) - i][0]
graph[(R-1) - i][0] = prev_graph
prev_graph = temp
# DEBUG
# print("spin down")
# for i in range(R):
# print(graph[i])
return True
def sum():
sum = 0
for i in range(R):
for j in range(C):
sum = sum + graph[i][j]
sum = sum + 2
return sum
def dust(T):
while T :
# logic
spread()
spin()
T = T - 1
return sum()
print(dust(T))
특별한 예외 케이스 없는 "구현(확산 로직) + 탐색 + 배열 돌리기" 로 이루어진 문제이다.
배열 돌리기 에서 경계값이 헷갈려서 시간이 좀 들었다.
좀 더 연습해야겠다 !