[BOJ] Q1135 뉴스 전하기

Question

Language: Python

Difficulty: Gold 2

Tree + DP 결합한 형태의 유형의 문제로, Top-Down 접근 방식을 고려하여 문제 풀이를 진행한다. 각각의 자식 노드에 대해서 해당 자식 노드를 처리하기 위한 시간을 파악해서 가장 많이 걸리는 시간을 해당 노드의 처리 시간으로 저장한다.

1135

모든 사람들에게 뉴스를 전달하기 위한 시간의 최솟값을 구하는 것이 목표이므로, 시간이 가장 오래 걸리는 자식 노드를 먼저 처리하기 위해 다음과 같이 정렬을 수행하고, 정렬 순서 + 해당 자식 노드 처리 시간이 가장 높은 값을 구한다.

childs.sort(reverse=True)
#가장 오래 걸리는 시간 값을 저장한다.
dp[vertex]=max([childs[i] + i+1 for i in range(len(childs))])

Solution

import sys

def solution(vertex):
    global dp

    childs=[]
    #자식이 있으면 계속 내려간다.
    if tree[vertex] != []:
        for adj_vertex in tree[vertex]:
            solution(adj_vertex)
            #자식 노드가 처리가 되면 자식 노드가 처리 되기 위한 시간 값을 저장
            childs.append(dp[adj_vertex])
    #더 이상 자식이 없는 경우
    else:
        return 0
    #시간이 많이 걸리는 자식을 먼저 처리할 수 있도록 한다.
    childs.sort(reverse=True)

    #가장 오래 걸리는 시간 값을 저장한다.
    dp[vertex]=max([childs[i] + i+1 for i in range(len(childs))])
    return dp[vertex]

if __name__ == '__main__':
    n=int(input())
    child_infos=list(map(int,input().split()))
    tree=[[] for _ in range(n)]

    for child in range(1,n):
        parent=child_infos[child]
        tree[parent].append(child)
    
    dp=[0] * n
    solution(0)
    print(dp[0])

댓글남기기