난이도 : D5
문제번호 : 1248
문제 주소 및 출처입니다.
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
1. 문제 설명
이진 트리에서 임의의 두 정점의 공통 조상 중 가장 가까운 것을 찾으려 한다. 예를 들어, 아래의 이진 트리에서 정점 8과 13의 공통 조상은 정점 3와 1 두 개가 있다. 이 중 8, 13에 가장 가까운 것은 정점 3이다. 정점 3을 루트로 하는 서브 트리의 크기(서브 트리에 포함된 정점의 수)는 8이다. 임의의 이진 트리가 주어지고, 두 정점이 명시될 때 이들의 공통 조상 중 이들에 가장 가까운 정점을 찾고, 그 정점을 루트로 하는 서브 트리의 크기를 알아내는 프로그램을 작성하라. 입력에서 주어지는 두 정점이 서로 조상과 자손 관계인 경우는 없다. 위의 트리에서 예를 든다면 두 정점이 “11과 3”과 같이 주어지는 경우는 없다. |
입력
가장 첫줄은 전체 테스트케이스의 수이다. |
출력
총 10줄에 10개의 테스트 케이스 각각에 대한 답을 출력한다. |
예시
입력 | 출력 |
10 13 12 8 13 1 2 1 3 2 4 3 5 3 6 4 7 7 12 5 9 5 8 6 10 6 11 11 13 10 9 2 10 1 2 1 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 ... |
#1 3 8 #2 1 10 ... |
2. 문제풀이
그래프 문제인데 공통의 조상을 찾는 문제이다. |
3. 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
# D5 1248 공통조상
# 자기 위의 노드가 누구누구 있는지 확인하는 함수
def find_parent(n, idx, count=0):
# 트리를 돌면서 체크하자
for i in tree[idx]:
# i[1]이면 부모라는 뜻이다.
if i[1]:
# 부모노드를 찾았으니까 set에 추가하고
parents[n].add(i[0])
# 몇번째 만에 찾았는지 모르니까 순서도 저장하고
order[n][i[0]] = count
# 다시 돌린다.
find_parent(n, i[0], count+1)
# 트리의 크기를 찾기위한 함수
def find_tree(n):
global tree_size
# 반복문 돌려보자
for i in tree[n]:
# 자식노드만 찾으면 되니까 i[0]이 0인거 찾는다.
if not i[1]:
# 찾았으면 트리사이즈 하나늘리고
tree_size += 1
# 다시 돌린다
find_tree(i[0])
for t in range(int(input())):
# 결과 출력용 변수
# 시작하는 노드 포함이니까 1로 셋팅
tree_size = 1
my_parent = -1
# 입력받고
V, E, A, B = map(int, input().split())
temp = list(map(int, input().split()))
# 필요한 변수 만들어주고
# 공통찾기용
parents = {A:set(), B:set()}
# 순서찾기용
order = {A:{}, B:{}}
# 그래프 리스트화
tree = [[] for _ in range(V+1)]
for i in range(0, len(temp), 2):
a, b = temp[i], temp[i+1]
tree[a].append((b, 0))
tree[b].append((a, 1))
# 자기 부모노드 찾고
find_parent(A, A)
find_parent(B, B)
# 교집합으로 후보군 정리하고
candidatekey = list(parents[A] & parents[B])
distance = 999
# 제일 가까운 조상 찾기
for i in candidatekey:
if order[A][i] < distance:
distance = order[A][i]
my_parent = i
# 트리 크기 찾아주고
find_tree(my_parent)
#결과출력
print('#{} {} {}'.format(t+1, my_parent, tree_size))
|
'코딩테스트 > SWExpertAcademy' 카테고리의 다른 글
Ladder1 Python(SW Expert Academy, SWEA) (0) | 2020.06.05 |
---|---|
금속막대 Python(SW Expert Academy, SWEA) (0) | 2020.06.04 |
최적경로 Python(SW Expert Academy, SWEA) (2) | 2020.06.02 |
작업순서 Python(SW Expert Academy, SWEA) (0) | 2020.06.01 |
상원이의 생일파티 Python(SW Expert Academy, SWEA) (0) | 2020.05.31 |
댓글