당신은 나의 누구인가요
시간 제한2초메모리 제한256 MB
가족 관계도를 읽고 두 사람을 입력으로 주면 한 사람이 다른 사람에게 어떤 친척인지 영어 호칭으로 출력합니다.
문제
클라라메이 이모는 친척의 가계도를 그리고 있다. 그런데 두 사람이 서로 어떤 사이인지 자꾸 헷갈린다. 가계도를 읽어서 두 사람 사이의 호칭을 붙이는 프로그램을 작성하라.
가계도는 항상 다음 규칙을 지킨다.
- 두 번 결혼한 사람은 없다. 따라서 의붓 관계는 나타나지 않는다.
- 가계도의 모든 자녀는 결혼한 부부의 자녀이고, 아버지는 남자이며 어머니는 여자이다.
- 남매끼리 결혼한 경우와 어떤 종류든 사촌끼리 결혼한 경우는 없다.
- 가계도의 모든 사람은 결혼과 부모 자식 관계로 서로 이어져 있다.
호칭은 다음 정의를 따른다. 호칭은 영어 단어이며 영어 그대로 출력한다.
father와mother는 자녀의 부모이다.brother와sister는 부모가 같은 남자 형제와 여자 형제이다.son과daughter는 부모의 자녀이다.uncle과aunt는 자녀의 부모와 형제자매인 남자와 여자이다.nephew와niece는 형제자매의 남자 자녀와 여자 자녀이다.grandfather와grandmother는 자녀의 부모의 아버지와 어머니이다.great grandfather와great grandmother는 자녀의 조부모의 아버지와 어머니이다.great uncle과great aunt는 자녀의 조부모와 형제자매인 사람이다.removed가 붙지 않은 사촌은 가계도에서 같은 세대에 있다.1st cousins는 조부모가 같고,2nd cousins는 증조부모가 같으며, 그다음도 같은 방식이다.removed가 붙은 사촌은 세대가 다르다.1st cousins 1-time removed는 어떤 사람과 그 사람의 첫째 사촌의 자녀 사이에 성립하고,1st cousins 2-times removed는 어떤 사람과 그 사람의 첫째 사촌의 손주 사이에 성립하며, 그다음도 같은 방식이다.- 사촌 관계는 대칭이다. A가 B의
1st cousins 2-times removed이면 B도 A의1st cousins 2-times removed이다. - 결혼 때문에 생기는 관계는 인척 관계이고 호칭 뒤에
-in-law가 붙는다. 배우자의 부모는father-in-law또는mother-in-law, 배우자의 형제자매는brother-in-law또는sister-in-law, 배우자의 사촌은cousins-in-law이다.
그림 1은 첫 번째 예제의 가계도이다. 이 가계도에서 Claire와 Carol은 1st cousins이고, Claire와 Diva는 1st cousins 1-time removed이며, Claire와 Chris는 1st cousins-in-law이다.

그림 1: 첫 번째 예제의 가계도
입력
입력은 가계도 하나와 질의 목록으로 이루어진다.
첫째 줄에 가계도를 만드는 관계의 개수 ()이 주어진다. 다음 개 줄에는 세 문자열 name1, name2, relation이 공백 하나로 구분되어 주어진다. 모든 이름은 영문자로만 이루어지고 서로 다르다. relation은 husband, wife, son, daughter 중 하나이며, 각 줄은 "name1은 name2의 relation이다"로 읽는다.
다음 줄에 질의의 개수 ()가 주어진다. 다음 개 줄에는 서로 다른 두 이름 name1과 name2가 공백 하나로 구분되어 주어진다. 두 이름 모두 가계도에 있다.
주어진 관계만으로 가계도에 있는 모든 사람의 성별을 알아낼 수 있다. 각 결혼에서 부모가 입력에 함께 주어진 사람은 많아야 한 명이다. 질의로 주어진 두 사람은 아래에서 정의하는 관계 중 정확히 하나로 이어져 있다.
출력
질의마다 name1이 name2의 무엇인지 한 줄로 출력한다.
먼저 혈연 거리를 정의한다. 어떤 사람의 조상은 자기 자신, 부모, 부모의 부모, 이런 식으로 거슬러 올라간 사람 전부이고, 자기 자신까지의 거리는 이다. 두 사람 와 의 공통 조상 중 가 가장 작은 사람을 고른다. 여기서 는 에서 그 조상까지 올라가는 세대 수이고, 는 에서 같은 조상까지 올라가는 세대 수이다. 이렇게 얻은 순서쌍을 라 하자. 공통 조상이 없으면 두 사람은 혈연이 아니다.
각 질의는 다음 순서로 판정한다.
name1이name2의 배우자이면name1의 성별에 따라name1 is the husband of name2또는name1 is the wife of name2를 출력한다.- 그렇지 않고
name1과name2가 혈연이면 두 사람의 로 아래 호칭을 만들고-in-law는 붙이지 않는다. - 그렇지 않고
name1의 배우자가name2와 혈연이면 그 두 사람의 로 아래 호칭을 만들고-in-law를 붙인다. - 위 세 경우가 모두 아니면
name2의 배우자가name1과 혈연이다. 그 두 사람의 로 아래 호칭을 만들고-in-law를 붙인다.
네 경우 모두 남자 단어와 여자 단어 중 무엇을 쓸지는 name1의 성별을 따른다. 아래에서 는 결혼 때문에 생긴 관계이면 -in-law이고, 아니면 빈 문자열이다.
- :
name1은name2보다 세대 위의 조상이다. 남자면father, 여자면mother에서 시작한다. 이면 그대로 두고, 이면 앞에grand를 붙이며, 이면grand를 붙인 뒤 그 앞에great를 번 붙인다. 이렇게 만든 단어를X라 하고name1 is the XW of name2를 출력한다. - : 방향이 반대이다. 남자면
son, 여자면daughter에서 시작해 같은 규칙을 적용하면son,grandson,great grandson,great great grandson처럼 된다.name1 is the XW of name2를 출력한다. - 이고 : 남자면
name1 is the brotherW of name2, 여자면name1 is the sisterW of name2를 출력한다. - 이고 : 남자면
uncle, 여자면aunt에서 시작해 앞에great를 번 붙인 단어를X라 하고name1 is the XW of name2를 출력한다. - 이고 : 남자면
nephew, 여자면niece에서 시작해 앞에great를 번 붙인 단어를X라 하고name1 is the XW of name2를 출력한다. - 이고 : 두 사람은 사촌이다. , 라 하자.
name1 and name2 are D cousinsW를 출력한다.D는 뒤에 영어 서수 접미사를 붙인 것으로, 끝 두 자리가 , , 이면th를 붙이고, 그렇지 않으면 끝자리가 이면st, 이면nd, 이면rd, 나머지는th를 붙인다. 그러면1st,2nd,3rd,4th,11th,12th,13th,21st,22nd,23rd처럼 된다. 이면 뒤에 공백 하나와 를 쓰고, 이면-time removed를, 이면-times removed를 이어 붙인다.