백준 - 나무 재테크(16235)

marafo·2021년 4월 19일
0

삼성 역량테스트 - 구현

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

profile
프론트 개발자 준비

0개의 댓글