[이것이 코딩테스트다] 여행계획

Turtle·2024년 9월 24일
0
post-thumbnail

🗃️문제 설명

한울이가 사는 나라에는 N개의 여행지가 있으며, 각 여행지는 1 ~ N번까지의 번호로 구분됩니다. 또한 임의의 두 여행지 사이에는 두 여행지를 연결하는 도로가 존재할 수 있습니다. 이때, 여행지가 도로로 연결되어 있다면 양방향으로 이동이 가능하다는 의미입니다. 한울이는 하나의 여행 계획을 세운 뒤에 이 여행 계획이 가능한지의 여부를 판단하고자 합니다.

예를 들어 N = 5이고, 다음과 같이 도로의 정보가 주어졌다고 가정합시다.

  • 1번 여행지 - 2번 여행지
  • 1번 여행지 - 4번 여행지
  • 1번 여행지 - 5번 여행지
  • 2번 여행지 - 3번 여행지
  • 2번 여행지 - 4번 여행지

만약 한울이의 여행 계획이 2번 -> 3번 -> 4번 -> 3번이라고 해봅시다. 이 경우 2번 -> 3번 -> 2번 -> 4번 -> 2번 -> 3번의 순서로 여행지를 방문하면, 여행 계획을 따를 수 있습니다. 여행지의 개수와 여행지 간의 연결 정보가 주어졌을 때, 한울이의 여행 계획이 가능한지의 여부를 판별하는 프로그램을 작성하세요.

첫째 줄에 여행지의 수 N과 여행 계획에 속한 도시의 수 M이 주어집니다. (1 ≤ N, M ≤ 500)
다음 N개의 줄에 걸쳐 N x N 행렬을 통해 임의의 두 여행지가 서로 연결되어 있는지의 여부가 주어집니다. 그 값이 1이라면 서로 연결되었다는 의미이며, 0이라면 서로 연결되어 있지 않다는 의미입니다. 마지막 줄에 한울이의 여행 계획에 포함된 여행지의 번호들이 주어지며 공백으로 구분합니다.

첫째 줄에 한울이의 여행 계획이 가능하다면 YES를, 불가능하다면 NO를 출력합니다.

🖥️코드

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
maps = [list(map(int, input().split())) for _ in range(N)]
parent = [i for i in range(N+1)]
plan = list(map(int, input().split()))

def find(x):
    if parent[x] != x:
        parent[x] = find(parent[x])
    return parent[x]

def union(a, b):
    a = find(a)
    b = find(b)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

for i in range(N):
    for j in range(N):
        if maps[i][j] == 1:
            union(i, j)

flag = True
for i in range(M-1):
    if find(plan[i]) != find(plan[i+1]):
        flag = False
        break  

if flag:
    print("YES")
else:
    print("NO")

🧠아이디어

알고리즘 유형 : 유니온 파인드

부모 노드를 찾는 연산(find)과 합집합 연산(union)을 조건에 맞춰 수행 → 이 때, 조건이라 함은 2차원 테이블의 [i][j]의 값이 1이어야 한다.

또한 주어진 여행 계획의 인접한 값을 비교하여 같은 부모라면 갈 수 있게끔 하고 부모가 같지 않다면 실행에 옮길 수 없는 여행 계획이므로 멈추도록 한다.

🔒문제 출처 및 참고 코드

이것이 코딩테스트다 with 파이썬 - 여행계획
모범 답안 - 여행계획

0개의 댓글