Skip to content

Commit f4124f6

Browse files
committed
[BOJ] #1976. 여행 가자 / 골드 4 / 40분 / 힌트, 성공
1 parent 3c3284c commit f4124f6

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import sys
2+
sys.setrecursionlimit(10 ** 8)
3+
input = sys.stdin.readline
4+
5+
def union(a, b):
6+
p_a = find(a)
7+
p_b = find(b)
8+
9+
if p_a > p_b: # a의 대표보다 b의 대표가 더 작은 값을 가지면,
10+
parent[p_a] = p_b # a가 속한 집합을 b의 집합에 합치기
11+
else:
12+
parent[p_b] = p_a # 그렇지 않으면 b의 집합을 a의 집합에 합치기
13+
14+
def find(a):
15+
if a == parent[a]: # a가 자기 자신의 부모이면 대표 노드
16+
return a
17+
18+
parent[a] = find(parent[a]) # 경로 압축을 통해 a의 부모를 대표 노드로 재설정
19+
return parent[a]
20+
21+
# 도시의 개수 n과 여행 계획에 포함된 도시의 수 m을 입력받기
22+
n = int(input())
23+
m = int(input())
24+
25+
parent = [i for i in range(n)] # 각 도시는 처음에 자기 자신이 대표 노드.
26+
27+
# n개의 줄에 걸쳐 도시 간 연결 정보를 입력받고, 연결되어 있으면 union 연산 수행
28+
for i in range(n):
29+
arr = list(map(int, input().split()))
30+
for j in range(n):
31+
if arr[j]: # 1이면 i와 j가 연결되어 있으므로 union 연산 수행
32+
union(i, j)
33+
34+
# 여행 계획을 입력
35+
plan = list(map(int, input().split()))
36+
result = "YES"
37+
# 여행 계획에 있는 모든 도시가 같은 집합(대표 노드)을 가지는지 확인
38+
for i in range(1, m):
39+
if parent[plan[i]-1] != parent[plan[0]-1]:
40+
result = "NO"
41+
break
42+
43+
print(result)

0 commit comments

Comments
 (0)