p_시험장나누기_81305
| source | school.programmers.co.kr/learn/course... |
| topics | |
| types | 문제풀이 |
| 정답여부 | 모름 |
문제
유니온파인드하면서 합치면될듯?
답
내답
import heapq
def solution(k, num, links):
N = len(num) # 노드의 개수
parent = [i for i in range(N)] # 직계 부모
weight = []
for i in range(N):
weight.append([-num[i],i])
for i in range(N):
l,r = links[i]
increase= 0# 음수임
if l > -1:
parent[l] = i
increase += weight[l][0]
if r > -1:
parent[r] = i
increase += weight[r][0]
weight[i][0] += increase
update(parent,weight,increase,i)
# print(i,"------")
# print(parent,weight,increase)
heapq.heapify(weight)
# heap 사용하고 최소힙이니깐 - 이용함
# k만큼 for 문
# 앞에꺼하나 뺌
# 자식이없음. > 걍그거 리턴하시면됨.
# 자식보다 부모가 항상큼 > 고로 pop하면서 아니면 다시넣어주고 이런식으로하면댐
# 자식이잇음 > 자식이 하나면 그거랑 끊고 자식이 2명이면 둘중 큰거랑 끊음> 나랑 직계부모 업데이트, 부모정보도 업데이트+링크정보도 업뎃
# print('w',weight)
for _ in range(k-1):
w,i = heapq.heappop(weight)
l,r = links[i]
if parent[l] != i:
# 이미 끊어 졋던거임
l = -1
links[i][0]= -1
if parent[r] != i:
r = -1
links[i][1]= -1
if l<0 and r<0:
return -w
else:
targetW = None
depth = 0
remain = []
while targetW is None:
# print(depth)
if depth >N:
break
depth +=1
nw,ni = heapq.heappop(weight)
if ni <mark> l or ni </mark> r:
targetW = [nw,ni]
else:
remain.append([nw,ni])
for rem in remain:
heapq.heappush(weight,rem)
# print(targetW)
# 부모랑 연결끊기
if targetW is None:
return -w
tw,ti=targetW
w -= tw
parent[ti] = ti
heapq.heappush(weight,[w,i])
heapq.heappush(weight,targetW)
# print(weight)
# print(parent)
# print("-")
return -weight[0][0]
def update(parent,weight,value,idx):
i = idx
while parent[i] != i:
i = parent[i]
weight[i][0] += value