木材財テク(16235)



サムスン機能のテスト-実装

def ongoing(nutrition, tree, plus):
    tree.sort()
    # 봄
    for i in range(len(tree)): 
        if nutrition[tree[i][0] - 1][tree[i][1] - 1] >= tree[i][2]: # 나이보다 큰 양분이 있을 때
            nutrition[tree[i][0] - 1][tree[i][1] - 1] -= tree[i][2] # 나무 나이만큼 양분 차감
            tree[i][2] += 1 # 해당 나무 나이 + 1 
        else: # 나이보다 양분이 작을 때
            tree[i][3] = 0 # 살았다 -> 죽었다 전환 
    
    # 여름
    for i in range(len(tree)):
        if tree[i][3] == 0: # 반복문에서 idx = 3 죽은 나무 조회
            nutrition[tree[i][0] - 1][tree[i][1] - 1] += (int(tree[i][2] / 2)) # 죽은 나무 나이 2로 나눈만큼 양분 추가
            
    # 가을
    newTreeArray = [[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]] # 번식 나무 8개 범위
    for i in range(len(tree)):
        if tree[i][2] % 5 == 0: # 해당 나무 나이가 5배수일 때
            for j in range(len(newTreeArray)): # 주변 8개에 새로운 나무 심기
                if (0 <= tree[i][0] + newTreeArray[j][0] < len(nutrition)) and (0 <= tree[i][1] + newTreeArray[j][1] < len(nutrition))
                newTree = [tree[i][0] + newTreeArray[j][0], tree[i][1] + newTreeArray[j][1], 1, 1]
                tree.append(newTree)
                
    # 겨울
    for i in range(len(nutrition)):
        for j in range(len(nutrition)):
            nutrition[i][j] += plus[i][j]
            
                
def solution(relation):
    k = 4
    tree = [[2, 1, 3, 1], [3, 2, 3, 1]] # 각 배열 마지막은 1 : 살았다, 0 : 죽었다
    nutrition = [[5, 5, 5, 5, 5],
                 [5, 5, 5, 5, 5],
                 [5, 5, 5, 5, 5],
                 [5, 5, 5, 5, 5],
                 [5, 5, 5, 5, 5]]
    plus = [[2, 3, 2, 3, 2],
            [2, 3, 2, 3, 2],
            [2, 3, 2, 3, 2],
            [2, 3, 2, 3, 2],
            [2, 3, 2, 3, 2]]
    
    for i in range(k):
        ongoing(nutrition, tree, plus)

    return True
年齢比較は実施していない.
import sys
input = sys.stdin.readline
N, M, K = map(int, input().split())

# N 활용 -> A(영양분), tree 배열 
A = [list(map(int, input().split())) for i in range(N)]
tree = [[[] for _ in range(N)] for _ in range(N)]
ground = [[5] * N for i in range(N)] # 기본 양분 5씩 셋팅

for i in range(M): # 크리티컬한 부분. 나무 나이 대소비교를 위한 장치
    x, y, z = map(int, input().split())
    tree[x - 1][y - 1].append(z) # 나이를 배열에 넣는다

for x in range(K):
    # 봄
    for i in range(N):
        for j in range(N):
            if len(tree[i][j]) <= 0:
                continue
            tree[i][j].sort() # 가장 어린 나무에게 양분 공급용
            idx = 0
            
            while idx < len(tree[i][j]):
                if tree[i][j][idx] <= ground[i][j]:
                    ground[i][j] -= tree[i][j][idx] # 나이만큼 양분 먹기
                    tree[i][j][idx] += 1 # 트리 나이 한살 먹기
                    idx += 1 # 그 다음 나이 많은 나무로 반복문 진행
                else:
                    die = tree[i][j][idx:] # 양분 부족 -> 못먹은 나무들 
                    for t in die:
                        ground[i][j] += (t // 2)
                    tree[i][j] = tree[i][j][:idx] # 살아 있는 나무만 그 칸에 남긴다.
                    break
    # 가을
    di = [[-1, 0], [0, -1], [1, 0], [0, 1], [1, 1], [1, -1], [-1, 1], [-1, -1]]
    for i in range(N):
        for j in range(N):
            c = 0
            if tree[i][j]: # tree[i][j]번째에 존재하는 모든 나무들 조회
                for now in tree[i][j]:
                    if now % 5 == 0:
                        c += 1
            if c > 0:
                for k in range(8): # 주변 8개 구역 나무 번식 
                    ni = i + di[k][0]
                    nj = j + di[k][1]
                    # 항상 범위, 구역 넘는지 체크하는거 중요
                    if (0 <= ni < N) and (0 <= nj < N):
                        for y in range(c): # 그 자리에 나무기 있는 갯수(m) 만큼 새로운 나무를 추가한다.
                            tree[ni][nj].append(1) # 나이 1살짜리 나무 추가
    # 겨울                            
    for i in range(N):
        for j in range(N):
            ground[i][j] += A[i][j]
            
answer = 0
for i in range(N):
    for j in range(N):
        answer += len(tree[i][j])
        
print(answer)
解決できない原因
+)並べ替えにより,幼木を0位にし,大きさで養分を食べる木と食べられない木を区別する
1)春季の幼木への栄養供給部分
2)最小の木1本だけが養分を食べていると勘違いする->養分が十分であれば多くの木を植えることができる
3)デッドツリー[:idx]で処置し,デッドツリーでバリアを更新する(tree[i][j]).
4)この欄の活樹数(c)により,周辺8欄に1歳の木を増やす.ex)c=5の場合、周囲に40本の木が8マス5本
参照)
https://daimhada.tistory.com/114
https://yeoping.tistory.com/26