
풀이 시간
- 1h 6m
 
- 시간 초과에서 막혀서 3차원 list로 해결하는 아이디어를 참고함
 
구현 방식
- 나무에 대한 정보를 3차원 list로 저장한다
-> 이렇게 하면 봄과 여름을 한 번의 2중 for문을 통해 해결할 수 있음
-> for문에서 list의 원소를 삭제하는 부분이 조금 쉽지 않을 수 있는데, 살아있는 나무만 따로 모아두고, 나중에 tree[i][j].clear; tree[i][j].extend(live_tree) 해주는 방식으로 해결함 
- 3차원 list를 이용해 봄과 여름을 한 번에 처리해주는 게 시간초과 해결의 관건인 것 같다
 
코드
import sys
dx = [-1, -1, -1, 0, 0, 1, 1, 1]
dy = [-1, 0, 1, -1, 1, -1, 0, 1]
N, M, K= map(int, sys.stdin.readline()[:-1].split())
add = [] 
for n in range(N):
    add.append(list(map(int, sys.stdin.readline()[:-1].split())))
ground = [[5] * N for _ in range(N)] 
tree = [[[] for _ in range(N)] for _ in range(N)]
for m in range(M):
    x, y, z = map(int, sys.stdin.readline()[:-1].split())
    tree[x-1][y-1].append(z)
for k in range(K): 
    
    for i in range(N):
        for j in range(N):
            if tree[i][j]:
                tree[i][j].sort() 
                dead_tree = 0
                live_tree = []
                for age in tree[i][j]:
                    if ground[i][j] < age: 
                        dead_tree += age//2
                    else:
                        ground[i][j] -= age
                        age += 1
                        live_tree.append(age)
                ground[i][j] += dead_tree
                tree[i][j].clear()
                tree[i][j].extend(live_tree)
    
    for i in range(N):
        for j in range(N):
            if tree[i][j]:
                for age in tree[i][j]:
                    if age % 5 == 0:
                        for d in range(8):
                            nx = i + dx[d]; ny = j + dy[d]
                            if 0 <= nx < N and 0 <= ny < N:
                                tree[nx][ny].append(1)
    
    for i in range(N):
        for j in range(N):
            ground[i][j] += add[i][j]
result = 0
for i in range(N):
    for j in range(N):
        result += len(tree[i][j])
print(result)
결과
