Notion에서 작성한 글이라, 여기 에서 더 깔끔하게 보실 수 있습니다! 😮😊
대충 트리가 뭐다~ 정도만 아는 상태라, 일단 오늘 문제는 스킵했다가 나중에 공부를 하고 풀어야겠다고 생각했다. 그런데 “Challenger” 문제라 그런 것인지 괜히 도전해보고 싶었다(?). 😓
정말 몇 시간동안 파고들었지만 끝끝내 WA…
결국엔 틀린 일기나 다름없는 오늘의 글을 TIL이랍시고 작성하기 굉장히 부끄럽긴 하지만, 코드를 계속해서 고쳐나가면서 트리를 여러 방법으로 표현해 봤고, 비교 기준 설정, 재귀, 유사 DFS까지 도달하는 과정을 기록하고 싶어서 (철판을 깔고) 올리게 되었다.
다시 한 번 처음부터 푸는 마음으로 넓게 보고 왜 틀렸는지, 어디에서 어떤 부분이 논리적으로 잘못됐는지 재차 검토해 보아야 겠다.
트리 표현하기
비교 기준 설정
재귀
extend_child
를 짜는 데에 꽤 걸렸던 것 같다. 재귀 연습은 추가로 꼭 꼭 해야겠다.유사 DFS
tree
dictionary 특성상 어차피 아래로만(부모로 올라가지 않고 자식으로 내려가는) 순회가 진행될 수밖에 없기 때문에 visited
와 같은 리스트는 만들지 않았다.from collections import defaultdict
def extend_child(node):
ret = []
child = tree.get(node, [])
for c in child:
ret.append(c)
ret.extend(extend_child(c))
return ret
n = int(input())
emp = [*map(int, input().split())]
tree = defaultdict(list)
depth = [0]
for i in range(1, n):
tree[emp[i]].append(i)
depth.append(depth[emp[i]]+1)
times = [depth[i] + sum(not tree[c] for c in tree[i]) for i in range(n)]
# print(f'전달 우선순위를 고려하지 않은 전달 시간 : {times}')
# print(depth)
stack = [0]
while stack:
cur = tree[stack.pop()]
if cur:
child = sorted(cur, key=lambda x: max((times[c] for c in extend_child(x)), default=50))
for i in range(len(child)-1, 0, -1): # 전달 시간 갱신
depth[child[i]] += 1
for c in extend_child(child[i]):
times[c] += i
# print(f'depth updated : {depth[:10]}, {depth[10:20]}, {depth[20:]}')
stack.extend(child)
# print(depth)
print(max(depth))