from collections import deque
import sys
input = sys.stdin.readline
N,M,K = map(int,input().split())
AppendList = [list(map(int,input().split())) for _ in range(N)]
tree_info = [[[] for _ in range(N)] for _ in range(N)]
result = 0
forest = [[5]*N for _ in range(N)]
for _ in range(M):
X,Y,age = map(int,input().split())
tree_info[X-1][Y-1].append(age)
result += 1
dx = [-1,-1,-1,0,0,1,1,1]
dy = [-1,0,1,-1,1,-1,0,1]
for year in range(K):
for x in range(N):
for y in range(N):
if len(tree_info[x][y])>0:
temp = []
summer_forest = 0
cnt = 0
limited = len(tree_info[x][y])
while cnt < limited:
age = tree_info[x][y].pop()
if forest[x][y] >= age:
forest[x][y] -= age
temp.append(age+1)
else:
summer_forest += (age//2)
result -= 1
cnt += 1
temp.sort(reverse=True)
tree_info[x][y].extend(temp)
forest[x][y] += summer_forest
forest[x][y] += AppendList[x][y]
for x in range(N):
for y in range(N):
spread_cnt = 0
if tree_info[x][y]:
for val in tree_info[x][y]:
if val%5 == 0:
spread_cnt += 1
if spread_cnt:
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if 0<=nx<N and 0<=ny<N:
result += spread_cnt
tree_info[nx][ny].extend([1]*spread_cnt)
print(result)
구현을 하는 문제인데, 문제에 주어진 조건대로 면 된다. 문제는 시간초과의 벽이 너무 컸다. 시간초과가 나지 않도록 최대한 문제에 주어진 조건을 한번에 구현할수 있도록 하는게 중요했다.
import sys
input = sys.stdin.readline
N,M,K = map(int,input().split())
store = [list(map(int,input().split())) for _ in range(N)]
tree_info = [[{} for _ in range(N)] for _ in range(N)]
forest = [[5]*N for _ in range(N)]
tree_cnt = 0
for _ in range(M):
x,y,age = map(int,input().split())
tree_info[x-1][y-1][age] = 1
tree_cnt += 1
dx = [-1,-1,-1,0,0,1,1,1]
dy = [-1,0,1,-1,1,-1,0,1]
for _ in range(K):
for x in range(N):
for y in range(N):
if tree_info[x][y]:
summer_forest = 0
new_dict = {}
for age in sorted(tree_info[x][y].keys()):
if forest[x][y] >= age * tree_info[x][y][age]:
forest[x][y] -= age * tree_info[x][y][age]
new_dict[age+1] = tree_info[x][y][age]
else:
if forest[x][y] // age:
new_dict[age+1] = forest[x][y]//age
forest[x][y] -= age*new_dict[age+1]
if tree_info[x][y][age] - new_dict[age+1]:
summer_forest += (age//2) * (tree_info[x][y][age] - new_dict[age+1])
tree_cnt -= (tree_info[x][y][age] - new_dict[age+1])
else:
summer_forest += (age//2)*tree_info[x][y][age]
tree_cnt -= tree_info[x][y][age]
tree_info[x][y] = new_dict
forest[x][y] += summer_forest
forest[x][y] += store[x][y]
for x in range(N):
for y in range(N):
spread_cnt = 0
for age in tree_info[x][y]:
if not age%5:
spread_cnt += tree_info[x][y][age]
if spread_cnt:
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx <N and 0<=ny<N:
if tree_info[nx][ny].get(1):
tree_info[nx][ny][1] += spread_cnt
else:
tree_info[nx][ny][1] = spread_cnt
tree_cnt += spread_cnt
print(tree_cnt)
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 2812 크게 만들기 (0) | 2021.04.08 |
---|---|
[BOJ/백준] 14002 가장 긴 증가하는 부분 수열 4 (0) | 2021.04.08 |
[BOJ/백준] 2075 N번째 큰 수 (0) | 2021.04.08 |
[BOJ/백준] 1300 K번째 수 (0) | 2021.04.08 |
[BOJ/백준] 1967 트리의 지름 (0) | 2021.04.08 |