이름 순서 바로잡기

시간 제한2초메모리 제한512 MB

요약
각 이름을 이름 또는 성으로 배정해 모든 학생의 두 이름 순서가 맞도록 하면서, 순서를 뒤집어야 하는 학생 수를 최소로 구한다.
난이도

보통10점 중 7점

유형
그래프, 그리디, 구현, 완전 탐색
정답자
아직 제출이 없습니다

문제

졸업식에서 누가 언제 단상에 오를지 정하려면 보통 성을 알파벳 순으로 정렬하고, 성이 같으면 이름으로 순서를 정한다. 그러려면 먼저 각 학생의 이름과 성이 각각 무엇인지 알아내야 한다. 그런데 (1) 여러 나라와 문화권에서는 성과 이름의 순서가 반대이고, (2) 순서가 반대인 경우가 아니더라도 10,000줄짜리 운영체제를 거뜬히 작성하는 학생들이 “First Name”과 “Last Name” 두 칸 중 어디에 자기 이름과 성을 넣어야 하는지는 잘 판단하지 못한다는 문제가 있어서 이 일이 더 어려워진다. 이 문제에서는 USC 관리자가 이름과 성의 순서를 바로잡을 수 있도록 돕는 프로그램을 작성한다.

각 학생마다 그 학생이 이름과 성으로 입력한 두 문자열이 주어진다. 또한 각 문자열은 이름으로만 쓰이거나 성으로만 쓰일 수 있고, 둘 다로 쓰일 수는 없다고 가정한다.1 예를 들어 “Aretha Franklin”과 “Franklin Roosevelt”가 함께 있을 수 없다. 그러면 “Franklin”이 이름과 성 양쪽으로 쓰이기 때문이다. 두 학생이 이런 이름을 주장했다면 둘 중 한 명은 이름과 성을 뒤집어야 한다. 이름 목록이 주어졌을 때, 모든 이름이 일관되게, 즉 각 문자열이 이름으로만 쓰이거나 성으로만 쓰이도록 만들기 위해 입력한 이름을 뒤집어야 하는 학생 수의 최솟값을 출력한다. 불가능하면 “Impossible”을 출력한다.

1 완전히 현실적이지는 않다.

입력

첫 줄에는 입력 데이터 세트의 수 1≤K≤1001 \le K \le 100이 주어지고, 이어서 KK개의 데이터 세트가 주어진다. 각 데이터 세트는 다음과 같다.

첫 줄에는 이름이 포함된 학생 수 0≤n≤1,0000 \le n \le 1{,}000이 주어진다. 이어서 nn개의 줄에 두 문자열 si,1s_{i,1}, si,2s_{i,2}가 공백으로 구분되어 주어진다. 각 문자열은 1자에서 30자까지의 소문자로 이루어진다.

출력

각 데이터 세트마다 “Data Set x:”를 한 줄에 단독으로 출력한다. 여기서 x는 데이터 세트의 번호이다. 그다음 줄에 입력을 일관되게 만들기 위해 입력한 이름과 성을 뒤집어야 하는 학생 수의 최솟값을 출력한다. 방법이 없으면 “Impossible”을 출력한다.

각 데이터 세트 뒤에는 빈 줄을 하나 출력한다.

예제1

  1. 예제 1

    입력
    2
    5
    a b
    a c
    c d
    b d
    b e
    3
    alice bob
    bob carol
    alice carol
    
    예상 출력
    Data Set 1:
    2
    
    Data Set 2:
    Impossible