가계도 연구

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

요약
출생과 사망 기록을 처리한 뒤, 조상과 자손 질의에 대해 날짜와 함께 가계도를 재귀적으로 출력한다.
난이도

보통10점 중 5점

유형
재귀, 트리, 정렬, 구현
정답자
아직 제출이 없습니다

문제

요즘 많은 사람들이 자신의 조상을 찾는 일에 관심을 가진다. 이런 작업은 보통 여러 회사가 판매하는 가족사(family history) 소프트웨어로 이루어지는데, 이 소프트웨어는 값이 비싸고 McDoze X 운영체제에서만 동작한다. 이를 대신할 오픈 소스 프로그램을 작성하라.

입력과 출력

프로그램은 한 줄에 하나씩 주어지는 명령들을 읽는다. 명령의 형식은 다음 문법을 따른다.

command     ::= birth
            ::= death
            ::= ancestors
            ::= descendants
            ::= QUIT

birth       ::= BIRTH child : date : mother : father
death       ::= DEATH person : date
ancestors   ::= ANCESTORS person
descendants ::= DESCENDANTS person

child       ::= name
mother      ::= name
father      ::= name
person      ::= name
date        ::= name

name        ::= any sequence of characters that does not begin or end
                with a space and does not contain a colon

입력의 공백은 이름(name) 안에 포함된 경우를 제외하고 모두 무시된다. BIRTH와 DEATH 명령은 각각 한 사람의 출생과 사망을 기록하며, 모든 사람의 이름은 서로 다르다고 가정해도 된다. ANCESTORS와 DESCENDANTS 명령은 질의로, 앞선 BIRTH·DEATH 명령으로 기록된 정보를 이용해 지정한 사람의 가계도(또는 역방향 가계도)를 출력한다. QUIT 명령은 입력의 끝을 나타낸다.

BIRTH, DEATH, QUIT 명령은 아무것도 출력하지 않는다. 각 ANCESTORS(DESCENDANTS) 명령에 대해 다음을 출력한다.

  1. "ANCESTORS of"("DESCENDANTS of") 뒤에 그 사람의 이름을 붙인 줄을 출력한다.
  2. 바로 윗줄보다 2칸 들여쓴 뒤, 그 사람의 부모(자식) 중 알파벳순으로 첫 번째를 출력한다. 이름 뒤에 그 부모(자식)의 출생일, 공백 하나, 하이픈을 차례로 붙이고, 그 부모(자식)가 사망했다면 다시 공백 하나와 사망일을 덧붙인다. 그 부모(자식)의 출생 기록이 없으면 이름만 출력한다.
  3. 그 부모(자식)에 대한 조상(자손) 정보를 다시 2칸 더 들여써서 같은 방식(2~4단계)으로 출력한다.
  4. 나머지 부모(자식)에 대해 2~4단계를 반복하며, 들여쓰기는 앞의 부모(자식)와 동일하게 한다.

연속한 두 명령의 출력 사이에는 빈 줄을 하나 남긴다.

제약:

  • 입력의 각 줄은 100자를 넘지 않는다.
  • 입력은 최대 250줄이다.
  • 모든 DEATH, ANCESTORS, DESCENDANTS 명령은 이미 BIRTH 명령에 등장한 이름을 가리킨다.
  • QUIT는 입력의 마지막 줄에만 등장한다.

예제3

  1. 예제 1

    입력
    BIRTH John Doe : January 7, 1599 : Jane Doe : Adam Doe
    BIRTH Mary Worth : May 18, 1666 : Jane Doe : Adam Doe
    BIRTH Casper Ghost : Jan 2, 1959 : Mary Worth : John Doe
    DEATH Mary Worth : Jan 3, 1959
    ANCESTORS Casper Ghost
    DESCENDANTS John Doe
    QUIT
    
    예상 출력
    ANCESTORS of Casper Ghost
      John Doe January 7, 1599 -
        Adam Doe
        Jane Doe
      Mary Worth May 18, 1666 - Jan 3, 1959
        Adam Doe
        Jane Doe
    
    DESCENDANTS of John Doe
      Casper Ghost Jan 2, 1959 -
    
  2. 예제 2

    입력
    BIRTH Alice : 2000 : Beth : Carl
    ANCESTORS Alice
    QUIT
    
    예상 출력
    ANCESTORS of Alice
      Beth
      Carl
    
  3. 예제 3

    입력
    BIRTH Alice : 2000 : Beth : Carl
    DESCENDANTS Alice
    QUIT
    
    예상 출력
    DESCENDANTS of Alice