본문 바로가기
Study/Algorithm

[백준] #1976. 여행 가자 (python)

by 투말치 2022. 12. 16.

목차

    반응형

    문제

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

     

    1976번: 여행 가자

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

    www.acmicpc.net

    동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인지 알아보자. 물론 중간에 다른 도시를 경유해서 여행을 할 수도 있다. 예를 들어 도시가 5개 있고, A-B, B-C, A-D, B-D, E-A의 길이 있고, 동혁이의 여행 계획이 E C B C D 라면 E-A-B-C-B-C-B-D라는 여행경로를 통해 목적을 달성할 수 있다.

     

    도시들의 개수와 도시들 간의 연결 여부가 주어져 있고, 동혁이의 여행 계획에 속한 도시들이 순서대로 주어졌을 때 가능한지 여부를 판별하는 프로그램을 작성하시오. 같은 도시를 여러 번 방문하는 것도 가능하다.

     

    예시 입력

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

     

    예시 출력

    YES

     

    풀이

     

    이 문제는 유니온 파인드(Union-find) 알고리즘을 사용하면 된다.

     

    import sys
    from collections import deque
    
    n=int(sys.stdin.readline())
    m=int(sys.stdin.readline())
    city=list(range(201))
    possible=True
    
    def find(node):
        if city[node]==node:
            return node
        else:
            city[node]=find(city[node])
            return city[node]
    
    def union(a, b):
        a=find(a)
        b=find(b)
        city[b]=city[a]
    
    #(1) - 도시의 연결 정보를 기반으로 도시 연결
    for i in range(1, n+1):
        nums=list(map(int, sys.stdin.readline().split()))
        for idx, num in enumerate(nums):
            if num==1:
                union(i, idx+1)
    
    plans=deque(list(map(int, sys.stdin.readline().split())))
    while len(plans)>1:
        first=plans.popleft()
        second=plans.popleft()
        a=find(first)
        b=find(second)
        if a!=b:
            possible=False
            break
        plans.appendleft(second)
    
    if possible:
        print('YES')
    else:
        print('NO')

    문제에서 도시의 연결 정보를 제공하기 때문에 (1)에서 union 연산을 사용해 도시끼리 연결을 진행한다.

     

    반응형