CS/알고리즘_문제풀이(파이썬)

트리에서의 거리

Jedy_Kim 2021. 7. 7. 18:01
728x90

문제

트리가 주어지고, 두 노드 X, Y가 주어질 때, 이 두 노드 사이의 거리를 출력하는 프로그램을 작성하시오. 트리에서는 두 노드를 잇는 경로가 유일하기 때문에, 정답은 항상 유일하다는 것을 참고한다. 예를 들어, 다음과 같은 트리에서 노드 3, 노드 6 사이의 거리는 4이다.

 

입력

첫 번째 줄에 트리의 노드 개수 n, 두 노드 X, Y의 번호가 주어진다. ( 0 ≤ X, Y ≤ n < 1000 ) 두 번째 줄부터 트리의 간선 정보가 주어진다. 각 줄은 2개의 숫자 a, b로 이루어지며, 이는 노드 a가 노드 b의 부모노드라는 것을 의미한다. 루트는 노드 0이라고 가정한다.  

출력

두 노드 X, Y 사이의 거리를 출력한다.

 

예제 입력

11 3 6

0 1

0 2

1 3

1 4

1 5

2 6

2 10

6 7

6 8

6 9

예제 출력

4

 

#코드 : 왜 틀릴까?

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
import sys 
# 노드 a가 노드 b의 부모노드라는 것을 의미한다. 
# 루트는 노드 0이라고 가정한다. 
def getResult(dist, idx):
  # dist : 루트부터 해당 값의 레벨을 가진다. 
  global arr, start_idx, end_idx, x, y 
  if len(arr[idx]) > 0:
    for i in range(len(arr[idx])):  
      if arr[idx][i] == x: 
        start_idx = dist
      if arr[idx][i] == y: 
        end_idx = dist
      getResult(dist+1, arr[idx][i])
 
 
if __name__ == "__main__":
  
  input   = sys.stdin.readline
  n, x, y = map(int, input().split())
  arr     = [[] for _ in range(n)]
  # start_idx : 루트부터 해당 x값 까지의 레벨
  # end_idx   : 루트부터 해당 y값 까지의 레벨
  start_idx, end_idx = 00 
  for i in range(n-1):
    a, b = map(int, input().split())
    arr[a].append(b) 
    
  if len(arr) > 0:
    getResult(10)  
  print(start_idx + end_idx)
  
cs

 

#코드 : 통과

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
import sys 
# 노드 a가 노드 b의 부모노드라는 것을 의미한다. 
# 루트는 노드 0이라고 가정한다. 
def getResult(x, idx):
  global data, max_level, visited, y
  # x는 레벨, idx는 해당위치의 값을 가지고 깊이를 탐색하는 메서드
  if idx == y: 
    max_level = x
    return
  for i in range(len(data[idx])):
    if not visited[idx]:  
      visited[idx] = True
      getResult(x+1, data[idx][i])
      visited[idx] = False 
      
if __name__ == "__main__":
  input = sys.stdin.readline
  max_level = 0
  n, x, y     = map(int, input().split())
  get_data = [list(map(int, input().split())) for _ in range(n)]
  data     = [[] for _ in range(len(get_data))] 
  visited  = [False]*(n+1)
  
  for i in range(len(get_data)): 
    if len(get_data[i]) > 0:
      data[get_data[i][0]].append(get_data[i][1]) 
      data[get_data[i][1]].append(get_data[i][0]) 
 
   
  if len(data) > 0
    getResult(0, x) 
  print(max_level) 
cs

 

반응형

'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글

2×n 타일링  (0) 2021.07.12
타겟 넘버  (0) 2021.07.10
트리의 높이  (0) 2021.07.07
큐 구현하기  (0) 2021.07.06
  (0) 2021.07.05