bong-u/til

백준 - 1976 : 여행 가자 (G4)

수정일 : 2024-11-15

 1N = int(input())
 2M = int(input())
 3
 4parent = [i for i in range(N)]
 5
 6def find(node):
 7    if parent[node] != node:
 8        parent[node] = find(parent[node])
 9    return parent[node]
10
11def union(a, b):
12    a = find(a)
13    b = find(b)
14    if a < b:
15        parent[b] = a
16    else:
17        parent[a] = b
18
19for i in range(N):
20    for j, item in enumerate(map(int, input().split())):
21        if item:
22            union(i, j)
23
24path = list(map(int, input().split()))
25start = parent[path[0]-1]
26for i in range(1, M):
27    if parent[path[i]-1] != start:
28        print("NO")
29        break
30else:
31    print('YES')

문제

  • 서로 연결 된 도시에 대한 정보와 여행 계획에 있는 도시의 정보가 주어진다
  • 여행 계획에 속한 도시들 중 연결이 안된 도시가 있다면 “NO”, 없다면 “YES"를 출력하면 된다
  • TC

    • input

      3
      3
      0 1 0
      1 0 1
      0 1 0
      1 2 3

    • output

      YES

해결 방법

  • 연결된 도시에 대한 정보가 나오면 바로 유니온 연산을 수행한다
  • 여행 계획에 속한 도시들이 모두 같은 집합에 속해 있는지 검사한다

고찰

  • find 함수가 호출 되었을때, 재귀적으로 호출되면서 parent를 업데이트 시켜주어야 하는데, 그러지 않고 단순히 parent node를 반환만 하는 함수로 구현해서 여러 번 틀렸다.