단서를 찾아라!

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

요약
클루도에서 자신의 손패와 추리 및 증거 제시 기록이 주어질 때, 범인, 흉기, 장소 카드 중 확실하게 알아낼 수 있는 것을 추론한다.
난이도

어려움10점 중 8점

유형
그리디, 시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

클루도(Cluedo)는 1940년대 영국에서 만들어진 보드게임이다. 목표는 누가 보디 씨를 살해했는지, 어떤 흉기를 썼는지, 어느 방에서 벌어졌는지를 알아내는 것이다.

게임에는 카드가 21장 있다. 인물 카드 6장은 A부터 F까지, 흉기 카드 6장은 G부터 L까지, 방 카드 9장은 M부터 U까지 알파벳 한 글자로 표시한다. 게임을 시작할 때 인물 카드 1장, 흉기 카드 1장, 방 카드 1장을 무작위로 뽑아 아무도 보지 못하게 따로 빼 둔다. 이 세 장이 각각 범인, 흉기, 범행 장소다.

남은 18장은 잘 섞은 뒤 1번 플레이어부터 시작해 그 오른쪽의 2번 플레이어로 이어지는 순서로 한 장씩 나눠 준다. 이 문제에서 플레이어는 네 명이고, 4번 플레이어의 오른쪽은 다시 1번 플레이어다. 그래서 1번과 2번은 5장씩, 3번과 4번은 4장씩 받는다.

차례는 1번 플레이어부터 시작해 오른쪽으로 넘어간다. 자기 차례가 되면 용의자 한 명, 흉기 하나, 방 하나를 묶어 추리를 말하고, 이를 반박할 증거가 있는지 다른 플레이어에게 묻는다. 예를 들어 "범인은 인물 A, 흉기는 L, 장소는 방 T라고 생각한다"라고 말하는 식이다. 세 장 중 정확히 한 장을 가진 플레이어는 그 카드를 물어본 사람에게만 보여 줘야 한다. 두 장 이상 가진 플레이어는 그중 아무 카드나 한 장 골라 보여 준다.

추리를 말한 사람은 먼저 자기 오른쪽 플레이어에게 묻는다. 그 플레이어에게 증거가 없으면 다시 그 오른쪽 플레이어에게 묻고, 누군가 증거를 보여 주거나 세 명 모두 해당 카드를 하나도 가지고 있지 않을 때까지 이어 간다.

추리를 말한 사람이 아니어도 정보를 얻을 때가 많다. 위 예에서 내가 3번 플레이어이고 A와 T를 들고 있다고 하자. 다른 사람이 증거를 보여 줬다면 그 카드는 흉기 L일 수밖에 없다. 어떤 추리에 누가 증거를 냈는지 기록해 두는 것이 중요한 전략이다.

게임에서 이기려면 고발을 해야 한다. 고발할 때는 범인, 흉기, 방에 대한 최종 답을 말한다. 고발한 다음 처음에 빼 둔 세 장을 확인해서 고발 내용과 맞으면 이긴다. 그러니 고발하기 전에 완전히 확신해야 한다.

나는 1번 플레이어다. 내가 받은 카드와 지금까지 나온 추리와 증거 기록이 주어질 때, 고발에 필요한 세 가지 중 무엇을 이미 확정할 수 있는지 판단하라.

입력

첫째 줄에 게임 동안 나온 추리의 개수 nn이 주어진다. (1≤n≤501 \le n \le 50)

둘째 줄에 내가 받은 카드 다섯 장이 주어진다. 각 카드는 A부터 U까지의 대문자 한 글자다.

다음 nn개 줄에는 추리가 나온 순서대로 한 줄에 하나씩 주어진다. 차례는 1번 플레이어부터 시작해 오른쪽으로 넘어가므로 ii번째 추리는 ((i−1) mod 4)+1((i-1) \bmod 4) + 1번 플레이어가 말한 것이다. 각 줄은 추리를 나타내는 문자 세 개로 시작하며, 순서대로 인물, 흉기, 방이다. 그 뒤에는 최대 세 명의 응답이 추리를 말한 플레이어의 오른쪽 플레이어부터 차례대로 이어진다. 증거를 내지 않은 플레이어는 -로 적고, 증거를 낸 플레이어는 증거 문자로 적는다. 그 카드를 내가 직접 본 경우, 즉 내가 증거를 냈거나 내가 증거를 받은 경우에는 증거 문자가 그 카드를 그대로 나타낸다. 그렇지 않으면 증거 문자는 *다. 증거 문자는 마지막 응답에만 나올 수 있다. 모든 문자는 공백 하나로 구분된다. 입력에는 규칙에 맞는 추리와 응답만 주어진다.

출력

범인, 흉기, 방을 나타내는 문자 세 개를 한 줄에 출력한다. 범인을 확정할 수 있으면 그 인물의 문자를, 확정할 수 없으면 ?를 출력한다. 흉기와 방도 같은 방식으로 출력한다.

예제3

  1. 예제 1

    입력
    1
    B I P C F
    A G M - - -
    
    예상 출력
    AGM
    
  2. 예제 2

    입력
    2
    A B C D H
    F G M M
    F H M - *
    
    예상 출력
    E??
    
  3. 예제 3

    입력
    3
    A C M S D
    B G S - G
    A H S - - S
    C J S *
    
    예상 출력
    ???