Skip to content

Commit ab79f05

Browse files
committed
[BOJ] #2644. 촌수계산 / 실버2 / 51분 / 성공
1 parent 46b617d commit ab79f05

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# 2644-촌수계산. BFS 풀이
2+
import sys
3+
from collections import deque
4+
5+
input = sys.stdin.readline
6+
7+
n = int(input()) # 전체 사람 수
8+
a, b = map(int, input().split()) # 촌수 계산할 두 사람의 번호
9+
m = int(input()) # 부모-자식 관계의 개수
10+
graph = [[] for _ in range(n + 1)] # 그래프 초기화
11+
visited = [False for _ in range(n + 1)] # 방문 여부 초기화
12+
for _ in range(m):
13+
x, y = map(int, input().split())
14+
graph[x].append(y)
15+
graph[y].append(x)
16+
17+
18+
def bfs(start, end):
19+
queue = deque([(start, 0)]) # (노드, 거리) 형태로 초기화
20+
visited[start] = True # 시작 노드 방문 표시
21+
22+
while queue:
23+
v, dist = queue.popleft()
24+
25+
# 목표 노드에 도달 시 거리 반환
26+
if v == end:
27+
return dist
28+
29+
for neighbor in graph[v]:
30+
if not visited[neighbor]:
31+
visited[neighbor] = True
32+
queue.append((neighbor, dist + 1)) # 거리 1 증가하여 큐에 추가
33+
34+
return -1 # 연결되지 않았을 경우 -1 반환
35+
36+
37+
print(bfs(a, b))
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# 2644-촌수계산. DFS(백트래킹) 풀이
2+
import sys
3+
4+
input = sys.stdin.readline
5+
6+
n = int(input()) # 전체 사람 수
7+
a, b = map(int, input().split()) # 촌수 계산해야 하는 두 사람의 번호
8+
m = int(input()) # 부모 자식들간의 관계의 개수
9+
graph = [[] for _ in range(n + 1)] # 그래프
10+
visited = [False for _ in range(n + 1)] # 방문여부
11+
for _ in range(m):
12+
x, y = map(int, input().split())
13+
# 그래프 연결
14+
graph[x].append(y)
15+
graph[y].append(x)
16+
17+
result = -1 # 기본값은 -1로 설정하여 찾지 못한 경우에 대비
18+
19+
def backtracking(v, level):
20+
global result
21+
# 재귀함수 마치는 조건: a,b 촌수를 계산이 되었을 때
22+
if v == b:
23+
result = level
24+
return
25+
26+
# 탐색
27+
for i in graph[v]:
28+
if not visited[i]:
29+
visited[i] = True
30+
backtracking(i, level + 1) # 자식 노드 방문 level + 1을 넘겨줌으로써 촌수 계산
31+
visited[i] = False # 방문했다면 부모노드 다시 방문 기록 지움
32+
33+
34+
visited[a] = True # 초기 노드 방문 체크
35+
backtracking(a, 0)
36+
print(result)

0 commit comments

Comments
 (0)