E.
문제요약: 현재 토르가위치한 행성에서 다른 행성까지의 경로의 합이 D가 되는
행성의 개수를 구하는 문제입니다.
문제 풀이:
우선 생각할 수 있는 가장 단순한 풀이를 생각해봅시다. 현재 토르가 위치한 행성에서
경로의 합이 D가 되는 행성의 개수를 모두 구하기 위해서 DFS를 돌려주는 방식을
해봅시다. 이렇게 한다면 O(n)시간복잡도로 문제해결이 가능하지만
총 시간복잡도는 O(nQ)가 되서 더 빠른 솔루션이 필요합니다.
57.
E.
더 빠른 솔루션을생각해봅시다.
완전 이진 트리라는 점을 생각해보면, 트리의 높이 H 는 log(N)입니다.
노드 X의 에너지를 E[x]라고 합시다.
노드 X 에서 노드 X의 서브트리 안에 존재하는 모든 노드들까지의 경로의 합을 저장한다고 생각해봅시다.
그리고 이 경로의 합의 배열을 Dist[x]라고 합시다.
그렇다면 현재 노드 X에서 경로의 합이 D가 되는 행성의 개수를 모두 세어줍시다.
X의 부모 노드를 P라고 한다면 이제 P아래에서 경로의 합이 D-E[X] 인 행성까지의 거리를 세어주면 되는데
단, X의 서브트리는 모두 제외하고 세어주어야합니다. 어떻게 하면 좋을까요??
58.
E.
그렇다면 이걸 어떻게구할 수 있을까요?
현재 P노드를 3번 노드라고 하고, X노드를 7번 노드라고 해봅시다.
그렇다면 3번 노드에서 7번 노드의 서브트리를 제외하고 경로의 합을 계산하지말고
6번 노드의 서브트리안에서 경로의 합이 D-E[x]-E[p]가 되는 노드의 개수를 세어주고
3번 노드에서 7번 노드의 경로의 합이 D가 되는지도 확인해서 개수를 세어줍시다.
59.
E.
이런 방식의 알고리즘은각 노드의 서브트리의 사이즈를 SZ라고 한다면
log(SZ)의 시간복잡도로 저 노드들의 개수를 세어줄 수 있고 총 깊이에 비례해서 계산을 해주므로
총 시간복잡도는 log(sz)*H 가 되고 이건 log(n)*log(n)이 됩니다.
그렇다면 모든 쿼리에 대해서는 O(q *log^2(n) )의 시간복잡도를 갖습니다.
그렇다면 각 노드의 서브트리안에서의 모든 경로의 합을 어떻게 구하고 또 어떻게 정렬할 수 있을까요?
E.
현재 노드 6
1
2
45
3
6 7
서브 트리안에서의 경로의 합을 구해봅시다.
6 본인 자신의 에너지 하나만 나옵니다.
65.
E.
현재 노드 3
1
2
45
3
6 7
3번 노드에서는 6번 ,7번 노드의 경로의 합 배열을 갖고 있으므로
3번 노드 배열에서는 3번 노드 본인의 에너지를 하나를 추가하고
6번 노드의 배열안에 있는 원소를 3번 에너지만큼 더해서 추가해주고
7번 노드도 마찬가지로 3번 에너지만큼 더해서 추가해줍시다.
이렇게 한 추가하게 되고 다른 모든 노드에서도 마찬가지로 진행됩니다.
66.
E.
그렇다면 각 노드에서서브트리 사이즈를 sz라고 합시다.
그렇게 되면 경로의 합 배열을 만드는데에는 O(sz)만큼의 시간이 걸리게 되고
정렬을 하게 되면 O(sz * log(sz) ) 가 걸리고
따라서 총 시간복잡도는 O(Σsz *log(sz) ) 가 됩니다.
하지만 sz 는 n에 비례하게 되므로 총 시간복잡도는 너무 커질것 같아 보입니다.
67.
E.
H는 트리의 깊이입니다.
D[x] = x노드에서 자신의 서브트리 안의 리프 노드까지의 거리 + 1 이라고 해봅시다.
그렇다면 각 노드 x의 서브트리 사이즈는 2^D[x] -1 입니다.
그렇다면 D[x]가 1이 되는 개수는 2^(H -D[x]) 가 됩니다.
마찬가지로 D[x]가 2가 되는 개수는 2^(H-2)이 됩니다.
1
2
4 5
3
6 7
68.
E.
그렇다면 D[x]가 k가되는 노드의 개수는 2^(H-D[x])입니다.
그렇다면 모든 서브트리의 사이즈를 높이별로 구해보도록 합시다.
그렇다면 D[x]가 k가 되는 노드의 개수는 2^(H-k)이고
이러한 서브트리 사이즈는 2^(k) -1 이 됩니다.
그렇다면 각 D[x]가 k일 때의 서브트리 사이즈의 개수의 합은 O(2^H)입니다.
따라서 저희가 구하고자 한 총 시간복잡도는 O(H* 2^H) 이 되고 이걸 다시 쓰게 되면
총 사이즈의 합은 O(nlogn) 이 됩니다.
그리고 저희가 구하고자 한 총 시간복잡도는 O(nlog^2n)이 됩니다.
69.
E.
시간 복잡도 :O( (N+ Q)* log^2(N) )
메모리 복잡도 O( N*log(N))
알고리즘 분류 : 정렬, 이진탐색, DFS
H.
문제요약: 물건 하나를사는 비용은 에너지와 무게의 곱으로 표현이 된다.
그리고 특정 조건하에서 최소의 비용으로 모든 부품을 사야 한다.
문제 풀이:
조건을 요약해서보면 X<Y라면, Y부품을 X부품보다 먼저 살 수는 없고
여러개의 물건을 같이 사게 된다면 에너지의 최대값 * 무게의 최대값이 비용이 됩니다.
83.
H.
그렇다면 여러개의 부품을한번에 같이 사고 싶다면 항상 연속한 순서의 부품을 살 수 밖에 없습니다.
그렇다면 여기서 떠올릴 수 있는 풀이법은 dp솔루션이 됩니다.
DP[i]= i-1번 부품까지 구입했을 때의 최소비용이라고 정의하고
max_W[L,R]= L번 부품부터 R번 부품까지의 최대 무게
max_E[L,R] = L번 부품부터 R번 부품까지의 최대 에너지.
DP[i]= min( DP[j] + max_W[j,i] ) ( 1<=j<=i) 의 점화식이 생성됩니다.