본문 바로가기

알고리즘 문제풀이

D5_1248. 공통조상 Python Tree 트리

정말 어렵다... 다른사람의 코드를 참고해서 사용했음

import sys;sys.stdin = open('txt/common_ancestor.txt')
t = int(input())
def find_parents(n,parent_arr): # node번호를 받기
    # if tree[n][0] != tree[m][0]:
    if tree[n][0]:
        parent_arr.append(tree[n][0]) # 부모를 더해간다.
        find_parents(tree[n][0],parent_arr)

# 현재 방식 root -> 왼 -> 오
def find_ancestor(parent1, parent2):
    for p1 in parent1:
        for p2 in parent2:
            if p1 == p2:  # 하나씩 비교하다가 같은것이 있을 때
                return p1
def calc_degree(node):
    global ancestor_size # 증가시킬것이기 때문
    for x in range(1,3): #이진 트리니까, 그리고 자식노드가 1, 2에 저장했기 때문에
        if tree[node][x]: # 해당 node에 자식노드가 있다면
            ancestor_size += 1 # 차수를 늘리겠다.
            calc_degree(tree[node][x]) # 그리고 자식 노드로 가서 다시 탐사하겠다.


for tc in range(1,t+1):
    V,E,node1,node2 = map(int,input().split())
    adjl = list(map(int,input().split()))

    tree = [[0,0,0] for _ in range(V+1)]
    for i in range(V-1):
        parent, child = adjl[i*2],adjl[i*2+1]
        tree[child][0] = parent # 자식의 0번째 인덱스는 부모
        if tree[parent][1] == 0:
            tree[parent][1] = child # 부모의 1번째 인덱스는 왼쪽 자식
        else:
            tree[parent][2] = child # 오른쪽 자식
    # 각 부모 노드
    node1_arr = []
    node2_arr = []
    find_parents(node1,node1_arr) # node1_arr 채우기
    find_parents(node2,node2_arr) # node2_arr 채우기
    # 조상 노드 찾기
    common_ancestor = find_ancestor(node1_arr,node2_arr) # 두 개의 리스트를 비교해서 리턴
    ancestor_size = 1 # 기본적으로 자기자신 노드를 포함하기 때문
    calc_degree(common_ancestor) # 조상님 노드부터 숫자 세기
    print(f'#{tc} {common_ancestor} {ancestor_size}')

'알고리즘 문제풀이' 카테고리의 다른 글

baekjoon No Duplicates Bronze 1  (0) 2024.02.21
Swea D2_11926. subset Python Tree  (0) 2024.02.21
Swea 1231. 중위순회 Python Tree  (0) 2024.02.20
백준 10953 A+B - 6 브론즈3  (0) 2024.02.20
백준 11817. 세 수 브론즈3  (0) 2024.02.20