For Programmer
백준 2644번 파이썬 문제풀이(촌수 계산) 본문
728x90
일반적인 트리문제이다. 해당 문제에서는 깊이와 부모 노드를 따로 구해놓고 이것을 비교해서 같은 부모가 있으면 제일 가까운 부모를 기준으로 다시 깊이를 계산하는 하여 더하는 식으로 구현 하였다.
N = int(input())
p1, p2 = map(int, input().split())
M = int(input())
graph = [[] for _ in range(N + 1)]
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
depth = [0 for i in range(N + 1)]
parent = [0 for i in range(N + 1)]
p1_parent = [] # p1 부모 저장
p2_parent = [] # p2 부모 저장
# 해당 노드부터 부모 찾기
def find_parent(x, parent_arr):
while x != 0:
parent_arr.append(x)
x = parent[x]
# 일반 트리 dfs돌기
def dfs(cur, pre):
for nxt in graph[cur]:
if nxt == pre:
continue
# 깊이 저장
depth[nxt] = depth[cur] + 1
# 부모 저장
parent[nxt] = cur
dfs(nxt, cur)
for i in range(1, N + 1):
if depth[i] == 0:
dfs(i, 0)
# 부모 찾기
find_parent(p1, p1_parent)
find_parent(p2, p2_parent)
# p1,p2 인덱스를 뒤부터 검색
p1_idx = len(p1_parent) - 1
p2_idx = len(p2_parent) - 1
# 둘중 작은 인덱스가 0보다 같거나 클때까지
while min(p1_idx, p2_idx) >= 0:
# 둘 부모 값이 달라지는 시점에서 break
if p1_parent[p1_idx] != p2_parent[p2_idx]:
break
p1_idx -= 1
p2_idx -= 1
# 만약 둘의 부모가 하나도 동일하지 않다면 친척이 아님
if p1_idx == len(p1_parent) - 1 and p2_idx == len(p2_parent) - 1:
print(-1)
else: # 동일한 부모가 하나라도 있다면
depth = [0 for i in range(N + 1)] # 다시 깊이 설정
dfs(p1_parent[p1_idx + 1], 0) # 해당 지점을 기준으로 깊이 계산
print(depth[p1] + depth[p2]) # 해당 깊이를 출력
728x90
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 1520번 파이썬 문제풀이(내리막길) (0) | 2022.03.20 |
---|---|
백준 16562번 파이썬 문제풀이(친구비) (0) | 2022.03.18 |
SWEA 5688번 파이썬 문제풀이(세제곱근을 찾아라) (0) | 2022.03.18 |
SWEA 4012번 파이썬 문제풀이(요리사) (0) | 2022.03.18 |
SWEA 1486번 파이썬 문제풀이(장훈이의 높은 선반) (0) | 2022.03.18 |
Comments