반응형
https://www.acmicpc.net/problem/1135
1135번: 뉴스 전하기
민식이는 회사의 매니저이다. 그리고, 민식이는 회사의 중요한 뉴스를 모든 직원에게 빠르게 전달하려고 한다. 민식이의 회사는 트리 구조이다. 모든 직원은 정확하게 한 명의 직속 상사가 있다
www.acmicpc.net
해결 방법 : DFS
- 직원 조직도 트리를 구성한 뒤에, 각 노드에서 자신의 부하 직원들이 소요하는 시간을 구하며 상향식으로 값을 구해나갔다.
- 부하 직원들의 소요시간이 클 수록 먼저 전화하는게 이상적이며, 그렇다고 해서 이들 중 가장 큰 시간 + 1이 현재 매니저 직원의 소요시간이 된다고 판단하면 안된다.
- 만약 [1, 49, 49, 49, 50] 으로 부하 직원들의 소요시간이 구성되었다고 한다면, 해당 매니저 직원의 소요시간은 52(부하) + 1(매니저)로 53이 되야함을 생각하면 된다.
- 따라서 부하직원들의 소요 시간을 담은 리스트 required를 내림차순 정렬한 뒤에, 각 요소에 인덱스를 더해주어 현재 매니저가 각 부하직원들에게 전화를 돌리는 시간을 합산해주었다. 이후의 max(required) + 1이 현재 매니저 직원의 소요시간이 된다.
import sys
input = sys.stdin.readline
from collections import defaultdict, deque
def solution(N, bossList):
T = defaultdict(list)
for i, boss in enumerate(bossList): # 조직도 트리 초기화
T[boss].append(i)
def dfs(boss):
if T.get(boss) is None: # 말단 부하 소요시간 1
return 1
required = [] # 부하 직원들의 소요시간
for emp in T[boss]:
required.append(dfs(emp))
required.sort(reverse=True)
required = [t + i for i, t in enumerate(required)] # 전화 통화 순서에 따라 추가 시간 합산
return max(required) + 1 # 부하직원으로 부터의 최대 소요시간 + 자신의 소요시간
return dfs(0) - 1
if __name__ == '__main__':
N = int(input())
bossList = list(map(int, input().split()))
result = solution(N, bossList)
print(result)
반응형
'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글
백준 1058 : 친구 (0) | 2021.08.03 |
---|---|
백준 1005 : ACM Craft (0) | 2021.07.31 |
백준 1306 : 달려라 홍준 (0) | 2021.07.30 |
백준 1214 : 쿨한 물건 구매 (2) | 2021.07.27 |
백준 1298 : 노트북의 주인을 찾아서 (0) | 2021.07.26 |