Coding Test/BaekJoon_Python

백준 2644 <촌수계산> Python

JunOnJuly 2023. 10. 26. 21:25
728x90

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

 

2644번: 촌수계산

사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어

www.acmicpc.net


전형적인 그래프 탐색 문제입니다. 일반적으로 DFS, BFS 중 선택해서 풀면 됩니다.


def solution(a, b, n, m, data_list):
    # 방문기록
    visited = [1 for _ in range(n+1)]
    visited[a] = 0
    # 트리
    tree = [[] for _ in range(n+1)]
    for parent, child in data_list:
        tree[parent].append(child)
        tree[child].append(parent)
   
    # DFS 쓸거임
    stack = [a]

    while True:
        # 경로가 없으면
        if not stack:
            return -1
        # b 에 도달했으면
        if stack[-1] == b:
            return len(stack)-1
        # 현재 노드
        now = stack[-1]
        for idx, node in enumerate(tree[now]):
            # 방문한 적 없으면
            if visited[node]:
                stack.append(node)
                visited[node] = 0
                break
            # 이동 가능 경로가 없으면
            elif idx == len(tree[now])-1:
                stack.pop()
                break


n = int(input())
a, b = map(int, input().split())
m = int(input())
data = [list(map(int, input().split())) for _ in range(m)]
print(solution(a, b, n, m, data))
728x90