열쇠

시간 제한1초메모리 제한128 MB

요약
열쇠고리에 달린 열쇠들을 고리끼리 연결한 상태에서, 두 사람이 각각 연결된 한 덩어리가 되도록 나누는 최소 열쇠 조작 횟수와 그다음 최소 고리 조작 횟수를 구한다.
난이도

어려움10점 중 8점

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

문제

숭이는 자신이 가진 열쇠 더미의 절반을 혜빈이에게 주려고 한다. 열쇠는 나선을 따라 밀어 넣어 열쇠고리에 끼우거나 빼낼 수 있고, 열쇠고리끼리도 같은 방식으로 서로 연결하거나 분리할 수 있다.

열쇠 하나를 고리에 끼우거나 빼는 것도, 고리 하나를 다른 고리에 연결하거나 분리하는 것도 각각 한 번의 작업으로 센다. 그런데 열쇠를 밀어 넣는 작업은 고리를 연결하거나 분리하는 작업보다 훨씬 힘들다(혜빈이가 손톱에 네일아트를 해 주기 때문에 손톱을 다치면 안 된다). 그래서 숭이는 먼저 열쇠를 끼우거나 빼는 작업의 횟수를 최소로 하고, 그 횟수가 같은 방법이 여러 가지라면 그중에서 고리를 연결하거나 분리하는 작업의 횟수를 최소로 하려고 한다.

모든 작업이 끝나면 열쇠 더미는 정확히 두 덩이, 즉 숭이가 가질 덩이와 혜빈이에게 줄 덩이로 나뉘어야 한다. 대문자 A부터 M까지의 열쇠는 숭이가 갖고, N부터 Z까지의 열쇠는 혜빈이가 갖는다. 각 덩이는 하나로 연결되어 있어야 하며, 모든 열쇠는 반드시 어떤 고리 하나에 끼워져 있어야 한다. 두 사람 중 한쪽에게 줄 열쇠가 하나도 없다면 굳이 두 덩이로 나눌 필요는 없다. 작업 도중 열쇠가 하나도 없는 빈 고리가 남을 수 있는데, 이런 고리는 두 덩이 어느 쪽에도 속하지 않도록 따로 떼어 둔다.

예를 들어 네 개의 열쇠가 세 개의 고리에 끼워진 상태에서 숭이가 혜빈이에게 열쇠 N과 R을 주려고 한다면, 열쇠 작업 두 번과 고리 작업 한 번으로 두 덩이로 나눌 수 있다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 한 줄에 두 문자가 적힌 여러 줄과, 마지막에 0만 적힌 한 줄로 끝난다. 소문자는 열쇠고리를, 대문자는 열쇠를 나타낸다. 한 줄의 두 문자는 열쇠가 고리에 끼워진 상태(열쇠, 고리)이거나 고리끼리 연결된 상태(고리, 고리)를 뜻한다. 입력은 파일의 끝에서 끝난다.

두 문자가 모두 대문자인 경우는 없다. 한 테스트 케이스 안에서 같은 쌍은 두 번 주어지지 않는다. 각 열쇠는 정확히 하나의 고리에만 끼워져 있으며, 처음 주어지는 상태에서는 모든 고리에 열쇠가 적어도 하나 끼워져 있다(작업을 하다 보면 열쇠 없는 고리가 생길 수는 있다). 등장하는 모든 열쇠와 고리는 입력에 적어도 한 번씩 나타난다.

출력

각 테스트 케이스마다 Case x: a b 형식으로 한 줄에 출력한다. 여기서 x는 1부터 시작하는 테스트 케이스 번호, a는 열쇠를 끼우거나 빼는 작업의 최소 횟수, b는 고리를 연결하거나 분리하는 작업의 최소 횟수이다. 필요한 두 덩이로 나누는 것이 불가능하면 대신 Case x: impossible을 출력한다.

예제4

  1. 예제 1

    입력
    ab
    bc
    aA
    aN
    Rb
    cB
    0
    aA
    bB
    Cc
    0
    aA
    aZ
    0
    aA
    bB
    cC
    xX
    yY
    ax
    xb
    by
    yc
    0
    
    예상 출력
    Case 1: 2 1
    Case 2: 0 2
    Case 3: impossible
    Case 4: 0 7
    
  2. 예제 2

    입력
    aA
    bZ
    0
    
    예상 출력
    Case 1: 0 0
    
  3. 예제 3

    입력
    aA
    ab
    bB
    0
    
    예상 출력
    Case 1: 0 0
    
  4. 예제 4

    입력
    aA
    bB
    cC
    0
    
    예상 출력
    Case 1: 0 2