귀족을 위한 가장 뜨거운 신상 데이팅 앱, Noble Knots를 개발하게 됐어요! 수백 년에 걸친 왕실의 근친혼으로 상황은… 복잡해졌어요. 이런, 우리 쌍둥이였네 같은 상황을 피하려면, 두 사람이 얼마나 가까운 친척인지 확인하는 시스템을 만들어야 해요.
Noble Knots는 아이슬란드의 "Islendinga-App"에서 영감을 받았어요. 이 앱은 아이슬란드 정착 시기부터 이어져 온, 아이슬란드 사람들 사이의 모든 알려진 가족 관계를 추적하는 데이터베이스를 바탕으로 해요. 알고리즘은 왕실 가계도에서 두 사람 사이의 분리 차수를 계산할 거예요.
이 앱이 완벽한 짝에게 왕관을 씌워 줄 수 있을까요?
여러분의 과제는 가계도에서 두 사람 사이의 분리 정도를 구하는 거예요. 이것은 모든 할리우드 배우가 케빈 베이컨과 6단계 이내로 연결되어 있다는 대중문화 속 이야기와 비슷해요.
다음과 같은 가계도가 주어졌다고 해봐요:
┌──────────┐ ┌──────────┐ ┌───────────┐
│ Helena │ │ Erdős ├─────┤ Shusaku │
└───┬───┬──┘ └─────┬────┘ └────┬──────┘
┌───┘ └───────┐ └───────┬───────┘
┌─────┴────┐ ┌────┴───┐ ┌─────┴────┐
│ Isla ├─────┤ Tariq │ │ Kevin │
└────┬─────┘ └────┬───┘ └──────────┘
│ │
┌────┴────┐ ┌────┴───┐
│ Uma │ │ Morphy │
└─────────┘ └────────┘
Tariq와 Uma의 분리 정도는 2예요 (Tariq → Isla → Uma). Isla와 Kevin 사이에는 알려진 관계가 없어요. 주어진 데이터에 연결이 없기 때문이에요. Uma와 Isla의 분리 정도는 1이에요.
Isla와 Tariq는 형제이고, 분리 정도가 1이에요. 마찬가지로 이 구현은 여러분과 아버지의 형제 사이의 분리 정도를 2로 보고할 거예요.
이 연습 문제의 테스트는 풀이가 Python에서 RelativeDistance class로 구현되기를 기대해요.
Python의 class가 익숙하지 않다면, classes와 공식 Python 문서의 classes부터 시작하는 게 좋아요.
RelativeDistance는 family_tree를 사용해 초기화해야 해요 (자세한 내용은 __init__()을 참고해요). family_tree는 keys가 각각의 사람이고 values가 그 사람의 자녀를 담은 list인 딕셔너리예요.
또한 person_a와 person_b 사이의 분리 정도를 반환하는 degree_of_separation 메서드도 구현해야 해요. 여기서 person_a와 person_b는 전달받은 가계도에 있는 사람들이에요.
RelativeDistance 클래스의 인스턴스를 만들 때 쓰이는 __init__ 특수 메서드의 스텁 구현과 degree_of_separation 메서드의 스텁이 주어져요.
먼저, family_tree 데이터를 나타낼 수 있도록 self (인스턴스)에 적절한 속성을 추가해 __init__을 수정해야 해요.
그런 다음 degree_of_separation 메서드에 로직을 추가해 person_a와 person_b 사이의 분리 정도를 계산하면 돼요.
때로는 예외를 발생시켜야 하는 경우가 있어요. 이럴 때는 오류의 원인이 무엇인지 알려 주는 의미 있는 오류 메시지를 항상 포함해야 해요. 그래야 코드를 더 읽기 쉽게 만들고, 디버깅에도 큰 도움이 돼요. 오류 원인이 특정 타입일 것이라고 알고 있는 상황이라면 내장 오류 타입 중 하나를 발생시켜도 되지만, 그래도 의미 있는 메시지를 포함해야 해요.
이 연습 문제에서는 raise 문을 사용해 여러 개의 ValueError를 "던져야" 해요.
첫 번째 상황에서는 RelativeDistance.degree_of_separation 메서드에 전달된 사람 중 하나 또는 둘 다 가계도에 없을 때 ValueError를 발생시켜야 해요.
# Example when Person A is not in the tree.
raise ValueError("Person A not in family tree.")
두 사람이 모두 가계도에 있다면, 규칙에서 정의한 유효한 연결이 둘 사이에 없을 때 ValueError를 발생시켜야 해요.
# Example when there are no valid connections.
raise ValueError("No connection between person A and person B.")
테스트는 기대하는 exception 타입을 raise하면서 그와 함께 기대하는 메시지를 포함할 때만 통과해요.
이 설명이 모든 내용을 담고 있지는 않으니, 테스트와 기대 결과를 꼼꼼히 확인해 봐요.
Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.