본문 바로가기
Problem Solving/BOJ

[BOJ][Python]1976 풀이

by NoiB 2023. 7. 28.
반응형

https://www.acmicpc.net/problem/1976

 

1976번: 여행 가자

동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인

www.acmicpc.net

import sys
ssr = sys.stdin.readline

def find(node):
    if uf[node] == node:
        return node
    else:
        uf[node] = find(uf[node])
        return uf[node]
    
def union(node1, node2):
    root1, root2 = find(node1), find(node2)
    if root1 != root2:
        if rank[root1] < rank[root2]:
            uf[root1] = root2
        elif rank[root1] == rank[root2]:
            uf[root1] = root2
            rank[root2] += 1
        else:
            uf[root2] = root1

n = int(ssr())
m = int(ssr())
uf = [i for i in range(n)]
rank = [0 for _ in range(n)]
for i in range(n):
    line = list(map(int, ssr().split()))
    for j in range(n):
        if line[j] == 1:
            union(i, j)
route = list(map(lambda x : int(x)-1, ssr().split()))
check = uf[find(route[0])]
for i in range(1, len(route)):
    if check != uf[find(route[i])]:
        print('NO')
        break
else:
    print('YES')

아무래도 유니온 파인드의 기본 문제들이다 보니까(정확히는 유니온 파인드를 써야 한다는 걸 미리 알았으니까) 쉽게 풀 수 있었던 문제가 아닌가 싶습니다. 유니온 파인드를 몰랐거나 어떤 알고리즘을 사용해서 풀어야 한다는 걸 몰랐다면 좀 더 헤맸겠죠.

 

해당 문제는 다른 도시를 경유하더라도 주어진 경로를 다 방문하기만 하면 되는 문제입니다. 경로에 방향성이 없기 때문에 어떻게든 연결만 되어있다면 즉, root 노드가 동일하다면 가능하다는 얘기죠(최소 횟수를 구하라든가 몇 번만에 간다든가 방향성이 있다든가 하는 조건이 없기 때문에 유니온 파인드를 쓰면 된다는 사실을 아는 순간 풀리는 문제나 다름 없습니다). 따라서 이 때 까지 해왔던 것처럼 유니온 파인드를 사용하시면 됩니다.

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python]1167 풀이  (0) 2023.07.30
[BOJ][Python]20040 풀이  (0) 2023.07.29
[BOJ][Python]4195 풀이  (0) 2023.07.27
[BOJ][Python]1717 풀이  (0) 2023.07.26