Coding Test/백준(Python)

[백준/Python] 3584번(DFS, 그래프 이론)_가장 가까운 공통 조상

syunze 2023. 8. 17. 17:52

📌문제 유형

 DFS, 그래프 이론 (골드 Lv.4)

 

📌문제

 

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

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

www.acmicpc.net

 

📌나의 문제풀이

- maps에 B(자식)에 [A(부모)] 저장

- DFS에서 상위 부모들 route에 모두 저장

  • route들의 순서 유지한 교집합 구하기

- 해당 방법으로 풀 경우, recursionlimit에 걸리므로 setrecursionlimit을 늘려야 함

# 그래프 이론으로 풀면 recursionlimit 안 늘려도 될 듯
import sys
sys.setrecursionlimit(10**5)

t = int(input())

def dfs(x, route):
    if maps[x] != []:
        route.append(maps[x])
        dfs(maps[x], route)
    return route

for _ in range(t):
    n = int(input())

    # B(자식)에 [A(부모)] 저장
    maps = [[] for _ in range(n+1)]
    for _ in range(n-1):
        a,b = map(int,input().split())
        maps[b] = a
    # 가까운 공통조상 구할 노드
    result_1, result_2 = map(int,input().split())
    route1, route2 = [result_1], [result_2]
    ans1 = dfs(result_1, route1)
    ans2 = dfs(result_2, route2)

    # 기존 순서 유지한 교집합 구하기
    result = [x for x in ans1 if x in ans2]
    print(result[0])

 

📌 다른사람의 문제풀이

- LCA
 

[백준] 3584번 - 가장 가까운 공통 조상 (파이썬)

# 가장 가까운 공통 조상 def find_parent(parent, x): result = [x] while parent[x]: result.append(parent[x]) x = parent[x] return result T = int(input()) for _ in range(T): N = int(input()) parent = [0 for _ in range(N+1)] for _ in range(N-1): a, b

2hs-rti.tistory.com

# 가장 가까운 공통 조상

def find_parent(parent, x):
    result = [x]
    while parent[x]:
        result.append(parent[x])
        x = parent[x]
    return result


T = int(input())
for _ in range(T):
    N = int(input())
    parent = [0 for _ in range(N+1)]
    for _ in range(N-1):
        a, b = map(int, input().split())
        parent[b] = a

    x, y = map(int, input().split())
    # 각 부모 리스트 정의
    x_parent = find_parent(parent, x)
    y_parent = find_parent(parent, y)

    # 깊이 맞춰주기
    i, j = 0, 0
    if len(x_parent) > len(y_parent):
        i = len(x_parent) - len(y_parent)
    else:
        j = len(y_parent) - len(x_parent)

    # 같은 깊이에서 최소 공통 조상 찾기
    while x_parent[i] != y_parent[j]:
        i += 1
        j += 1
    print(x_parent[i])

 

📌 리뷰

- 관점을 반대로 바라보기(보통은 부모노드에 자식 저장, 이번 경우는 자식 노드에 부모 저장)

- 순서 유지 교집합

 

순서유지 교집합 - python list ordered intersection

두 리스트의 교집합을 구하는 방법 1. 순서가 필요 없는 경우 : 파이썬의 내장 함수인 Set() 집합 함수를 ...

blog.naver.com

 
728x90