


아이디어 : 구현, 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))
특별한 예외 케이스 없는 "구현(확산 로직) + 탐색 + 배열 돌리기" 로 이루어진 문제이다.
배열 돌리기 에서 경계값이 헷갈려서 시간이 좀 들었다.
좀 더 연습해야겠다 !
'코딩테스트' 카테고리의 다른 글
| [백준] 16236번 : 아기 상어 - 파이썬 (0) | 2023.04.07 |
|---|---|
| [백준] 16926번 : 배열 돌리기 1 - 파이썬 (0) | 2023.04.05 |
| [백준] 10815번 : 숫자 카드 - 파이썬 (0) | 2023.03.28 |
| [백준] 14497번 : 주난의 난 - 파이썬 (0) | 2023.03.23 |
| [백준] 2178번 : 미로 탐색 - 파이썬 (2) | 2023.03.19 |