n
: 전체 사람의 수 ()
start
, end
: 촌수 계산하려는 두 사람의 번호
m
: 부모 자식들 간 관계의 계수
x
, y
: 각각 부모, 자식 번호
✅ 입력 조건
1.n
입력
2. 촌수 계산하려는target
두 사람 번호 입력
3.m
입력
4.m
번 반복해x
,y
입력
✅ 출력 조건
1.x
,y
의 촌수 계산한 정수 출력
1부터 n까지의 번호를 가진 사람들 중에서 알고 싶은 두 사람의 촌수를 계산하는 문제이다.
나
를 기준으로,
위의 예시로 알 수 있다시피, 촌수는 현재 노드에서 찾고자 하는 노드까지 가는데 몇 개의 노드를 이동하면 되는지를 의미한다.
m
번 반복해 입력 받은 x
, y
는 노드 간 연결 정보를 의미하므로 그래프에 저장한다.
그래프를 순환하며 현재 노드에서 찾고자 하는 번호의 노드를 찾을 때까지 탐색하는 DFS를 아래와 같이 구현한다.
-1
출력그래프 초기화 & 저장 →
DFS 탐색 →
최종 시간복잡도
으로 최악의 경우에도 1초 내로 계산이 가능할 것 같다.
입력 받은 두 사람 중 한 사람부터 출발해 다른 한 사람이 나올 때까지 DFS 수행하기
import sys
input = sys.stdin.readline
# DFS 구현
def dfs(v, count):
# 방문 처리
visited[v] = 1
# 찾고자 하는 노드 발견
if v == end:
return count
# 재귀적 탐색
for i in graph[v]:
if not visited[i]:
result = dfs(i, count+1)
# result가 있다면
if result is not None:
return result
# n 입력
n = int(input())
# 찾고자 하는 두 사람 입력
start, end = map(int, input().split())
# m 입력
m = int(input())
# 그래프 정의
graph = [[] for _ in range(n+1)]
# 방문 처리 리스트 정의
visited = [0] * (n+1)
# m 반복해 관계 입력
for _ in range(m):
parent, child = map(int, input().split())
graph[parent].append(child)
graph[child].append(parent)
# DFS 수행
count = dfs(start, 0)
# 결과 출력
if count == None:
print(-1)
else:
print(count)