알고리즘

[백준] 16235. 나무 재테크

담쏙 2021. 10. 7. 22:12
728x90

https://www.acmicpc.net/problem/16235

 

16235번: 나무 재테크

부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터

www.acmicpc.net

pypy3로 돌렸다. 문제만 이해하면 어렵지 않은 문제다. 그냥 시키는 대로 구현하면 된다. 나는 봄, 여름, 가을, 겨울 모두 함수를 만들어 주었다.

 

기본 밭 리스트, 살아 있는 나무 리스트, 겨울마다 추가될 양분 리스트, 죽은 나무 리스트를 각각 다 만들어 주었다. 이렇게 안 만들어도 될 것 같은데 생각나는 게 이거밖에 없어서.. 나중에 효율적으로 다시 풀어보긴 해야할 것 같다.

 

봄에는 tree 리스트를 sort() 해주고 기본 밭에 있는 양분이 나무 나이보다 많으면 양분 - 나무 나이를 해주고 new_tree에 나무 나이 + 1 을 담아준다. 기본 밭 양분보다 나무 나이가 많다면 dead_tree에 담아준다. 여름에는 dead_tree 리스트를 돌면서 각 나무를 2로 나눠주고 기존 밭에 양분으로 추가한다. 가을에는 tree를 모두 돌며 나이가 5의 배수이면 8방향으로 새로 나무를 심어주고, 겨울에는 기존 밭에 양분을 추가 해준다.

 

봄에서 더 최적화를 하면 python에서도 돌아갈 것 같긴한데 일단은 나중에 생각해보는 걸로..

dy = [-1, -1, -1, 0, 0, 1, 1, 1]
dx = [-1, 0, 1, -1, 1, -1, 0, 1]


def spring():
    for i in range(n):
        for j in range(n):
            if trees[i][j]:
                trees[i][j].sort()
                new_tree = []
                for d in range(len(trees[i][j])):
                    if maps[i][j] >= trees[i][j][d]:
                        maps[i][j] -= trees[i][j][d]
                        new_tree.append(trees[i][j][d]+1)
                    else:
                        dead_trees[i][j].append(trees[i][j][d])
                trees[i][j] = new_tree


def summer():
    for i in range(n):
        for j in range(n):
            if dead_trees[i][j]:
                for d in range(len(dead_trees[i][j])):
                    maps[i][j] += dead_trees[i][j][d]//2


def autumn():
    for i in range(n):
        for j in range(n):
            if trees[i][j]:
                for age in trees[i][j]:
                    if age%5 == 0 :
                        for d in range(8):
                            ni = i + dy[d]
                            nj = j + dx[d]
                            if 0 <= ni < n and 0 <= nj < n:
                                trees[ni][nj].append(1)


def winter():
    for i in range(n):
        for j in range(n):
            maps[i][j] += A[i][j]


def print_trees():
    for i in range(n):
        print(*trees[i])


# r, c는 1부터 시작함 -> -1 해주기
n, m, k = map(int, input().split())
# 밭
maps = [[5]*n for _ in range(n)]
# 추가 양분
A = [list(map(int, input().split())) for _ in range(n)]
trees = [[[] for _ in range(n)] for _ in range(n)]

for _ in range(m):
    x, y, z = map(int, input().split())
    trees[x-1][y-1].append(z)

for _ in range(k):
    dead_trees = [[[] for _ in range(n)] for _ in range(n)]
    spring()
    summer()
    autumn()
    winter()

answer = 0
for i in range(n):
    for j in range(n):
        if trees[i][j]:
            answer += len(trees[i][j])

print(answer)