본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 3584 가장 가까운 공통 조상

by Alan_Kim 2023. 11. 13.
728x90
반응형

https://www.acmicpc.net/problem/3584

 

3584번: 가장 가까운 공통 조상

루트가 있는 트리(rooted tree)가 주어지고, 그 트리 상의 두 정점이 주어질 때 그들의 가장 가까운 공통 조상(Nearest Common Anscestor)은 다음과 같이 정의됩니다. 두 노드의 가장 가까운 공통 조상은, 두

www.acmicpc.net

 

 

 

문제 해결

  • LCA (Low Common Ancestor)알고리즘
  • 최소 공통 조상을 찾는 알고리즘은 트리문제에서 자주나오는 문제이다.
  • 무조건 공통 조상은 있으므로 각 노드에서 루트로 올라가는 길을 정리하여 루트부터 다시 내려가면서 서로 갈라지는 지점을 찾으면 된다. 갈라지기 전에 가장 가까운 공통 조상이다!

CODE

import sys
input = sys.stdin.readline

def find(x,y):
    x_parent = [x]
    y_parent = [y]

    while root[x] != x :
        x_parent.append(root[x])
        x = root[x]
    while root[y] != y:
        y_parent.append(root[y])
        y = root[y]
    x_level = len(x_parent)-1
    y_level = len(y_parent)-1

    while x_parent[x_level] == y_parent[y_level]:
        x_level -= 1
        y_level -= 1
    return x_parent[x_level+1]
if __name__=='__main__':
    T = int(input())
    for _ in range(T):
        N = int(input())
        root = [i for i in range(N+1)]
        for _ in range(N-1):
            P, C = map(int, input().split())
            root[C] = P
        c1, c2 = map(int, input().split())
        answer = find(c1,c2)
        print(answer)

 

728x90
반응형

'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글

[python] 백준 11664 선분과 점  (0) 2023.11.15
[python] 백준 1039 교환  (0) 2023.11.14
[python] 백준 2022 사다리  (0) 2023.11.12
[python] 백준 3043 장난감 탱크  (0) 2023.11.10
[python] 백준 2331 반복수열  (0) 2023.11.05

댓글