본문 바로가기

알고리즘/Baekjoon

최소 공통 조상. [3584]

[1. 문제 설명]

root 가 있는 tree 가 입력으로 주어질 때,

Nearest Common Ancestor 는 아래와 같이 정의 된다.

(Lowest Common Ancestor)

  • 두 노드의 가장 가까운 공통 조상
  • 두 노드를 모두 자식(자손) 으로 가지면서, 깊이가 가장 깊은 노드

최대 10,000 개의 노드가 존재하는 트리가 입력으로 주어지고,

임의의 두 노드가 주어질 때

최소공통조상을 찾는다.


[2. 풀이 접근]

A. root 를 찾는다.

  • 입력에서 edge 는 부모-자식 관계를 의미한다.
  • root 의 부모는 보통 자기 자신으로 정의되니,
  • 모든 노드에 대해서 부모가 자기자신인 노드를 찾도록 한다.

B. 각 노드의 높이를 구한다.

  • A 단계에서 root 를 찾았으므로,
  • root 를 시작으로 dfs 를 수행한다.
  • 각 재귀 호출마다, (현재 높이+1) 을 전달하도록 한다.

C. 두 노드의 높이가 일치하지 않는 경우, 같은 레벨로 맞추도록 한다.

  • 두 노드의 높이가 같지 않는 경우, 공통 조상 탐색 시 문제가 발생한다.
    => 매 루프마다 바로 위 부모로 올라가게 되는데, 높이가 같지 않는 다면 root 에서 만나게 되기 때문이다.
    => ex) 11 과 12 에서 매 루프마다 위로 올라가면 결국 root 에서만 만나게 된다.

D. 매 루프 마다 위로 올라간다.

  • 두 노드가 같아지는 순간 종료하도록 한다.

 

시간복잡도

단계 A> O(n)

단계 B> O(n)

단계 C> O(n) 

==> 트리가 skewed 된 경우를 고려하면...

 

총 시간복잡도 => O(Tn)


[3. 코드]

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

최소 공통 조상. [11438]  (0) 2022.10.24
Sparse table. [17435]  (0) 2022.10.23
위상 정렬. [16169]  (0) 2022.10.21
위상 정렬. [1005]  (0) 2022.10.21
위상 정렬. [14567]  (0) 2022.10.20