728x90
반응형
[알고리즘] LCA(Lowest Common Ancestor)
최소 공통 조상을 찾는 알고리즘
→ 두 정점이 만나는 최초 부모 정점을 찾는 것!
트리 형식이 아래와 같이 주어졌다고 하자
4와 5의 LCA는? → 4와 5의 첫 부모 정점은 '2'
4와 6의 LCA는? → 첫 부모 정점은 root인 '1'
어떻게 찾죠?
해당 정점의 depth와 parent를 저장해두는 방식이다. 현재 그림에서의 depth는 아래와 같을 것이다.
[depth : 정점]
0 → 1(root 정점)
1 → 2, 3
2 → 4, 5, 6, 7
parent는 정점마다 가지는 부모 정점을 저장해둔다. 위의 예시에서 저장된 parent 배열은 아래와 같다.
// 1 ~ 7번 정점 (root는 부모가 없기 때문에 0)
int parent[] = {0, 1, 1, 2, 2, 3, 3}
이제 이 두 배열을 활용해서 두 정점이 주어졌을 때 LCA를 찾을 수 있다. 과정은 아래와 같다.
1
2
3
4
5
6
7
8
|
// 두 정점의 depth 확인하기
while(true){
if(depth가 일치)
if(두 정점의 parent 일치?) LCA 찾음(종료)
else 두 정점을 자신의 parent 정점 값으로 변경
else // depth 불일치
더 depth가 깊은 정점을 해당 정점의 parent 정점으로 변경(depth가 감소됨)
}
|
cs |
트리 문제에서 공통 조상을 찾아야하는 문제나, 정점과 정점 사이의 이동거리 또는 방문경로를 저장해야 할 경우 사용하면 된다.
728x90
반응형
'Algorithm > 개념 정리' 카테고리의 다른 글
[알고리즘] 비트마스크(BitMask) (1) | 2020.02.28 |
---|---|
[알고리즘] 퀵소트(QuickSort) 구현 (C) (3) | 2020.01.09 |
[알고리즘] 그래프(Graph)에서 사이클(Cycle) 찾기 (2) | 2019.07.29 |
[알고리즘] XOR 비트 연산을 활용하기 (0) | 2019.07.29 |
[자료구조/Java] 이진탐색트리 (Binary Search Tree) (1) | 2019.07.23 |