문제 링크
- https://icpc.me/21725
사용 알고리즘
- 유니온 파인드
시간복잡도
- $O(N \log N)$
풀이
각 사람이 지출한 금액과 실제로 지출해야 하는 금액을 어떻게 잘 계산했다고 가정하고, 송금 과정을 구하는 방법부터 알아봅시다. 한 명이 “은행” 역할을 해서 돈을 적게 낸 사람은 은행에게 송금하고, 돈을 많이 낸 사람은 은행에게 돈을 받으면 $n-1$번의 송금만 필요합니다.
Union-Find를 이용해 그룹이 합칠 때마다 새로운 정점을 추가하면 그룹이 합쳐지는 과정을 트리로 나타낼 수 있습니다. 그룹이 돈을 지불할 때마다 그룹을 나타내는 정점에 지불한 돈을 더하면, 각 사람이 지불해야 하는 금액은 트리에서 자신의 조상 정점의 가중치를 모두 더한 것이 됩니다. 이는 DFS를 이용해 계산할 수 있습니다.
Union-Find 과정에서 $O(N \log N)$, DFS를 이용해 지불해야 하는 금액을 계산하는데 $O(N)$, 송금 과정을 복원하는데 $O(N)$이 걸리므로 전체 시간 복잡도는 $O(N \log N)$입니다.
전체 코드
1 |
|