반응형
https://programmers.co.kr/learn/courses/30/lessons/77887
코딩테스트 연습 - 중력 작용
1부터 n까지 번호가 하나씩 붙은 n개의 노드를 갖는 트리가 주어집니다. 각 노드에는 값이 하나씩 들어 있으며, 이 트리의 루트 노드는 1번 노드입니다. 당신은 이 트리에 대해 다음과 같은 쿼리
programmers.co.kr
시간초과 뜬다. 나중에 도전하겠다..
import sys
sys.setrecursionlimit(100000)
def solution(values, edges, queries):
answer = []
from collections import defaultdict
G = defaultdict(list)
rG = dict()
sG = defaultdict(int) # 자식 합
path = [0] * len(values)
def init_sum(node):
path[node - 1] = 1
child_sum = values[node - 1]
for next_node in G[node]:
if path[next_node - 1] == 0:
rG[next_node] = node
child_sum += init_sum(next_node)
sG[node] = child_sum
return child_sum
def query2(node, w):
while rG.get(node) is not None:
p_node = rG[node]
sG[node] -= values[node - 1] - values[p_node - 1] # node 하위 sum 초기화
values[node - 1], values[p_node - 1] = values[p_node - 1], values[node - 1] # get parent val
node = p_node # 상위 노드로
sG[1] -= values[0] - w
values[0] = w
sG[1] += values[0]
for f, t in edges:
G[f].append(t)
G[t].append(f)
init_sum(1)
for n, q in queries:
if q == -1: # query 1
answer.append(sG[n])
else: # query 2
query2(n, q)
return answer반응형
'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글
| 백준 9489 : 사촌 (0) | 2021.07.22 |
|---|---|
| 백준 2696 : 중앙값 구하기 (0) | 2021.07.18 |
| 프로그래머스 : N으로 표현 (0) | 2021.06.30 |
| 프로그래머스 : 순위 (0) | 2021.06.29 |
| 프로그래머스 : 단어 변환 (0) | 2021.06.28 |