트리 구축 알고리즘을 리팩터링해봐요.
일부 웹 포럼은 트리 구조를 사용해서 게시물을 트리 형태로 보여줘요. 그런데 게시물은 보통 정렬되지 않은 레코드 집합의 형태로 데이터베이스에 저장돼요. 따라서 사용자에게 게시물을 보여줄 때는 트리 구조를 다시 구성해야 해요.
이번에 할 일은 고도로 추상화된 레코드를 위한 트리 구축 로직을 구현한, 동작은 하지만 느리고 지저분한 코드를 리팩터링하는 거예요. 레코드에는 ID 번호와 부모 ID 번호만 들어 있어요. ID 번호는 항상 0 이상이고 레코드 목록의 길이 미만이에요. 루트 레코드를 제외한 모든 레코드는 자신의 ID보다 작은 부모 ID를 가져요. 루트 레코드는 부모 ID가 자신의 ID와 같아요.
예시 트리:
root (ID: 0, parent ID: 0)
|-- child1 (ID: 1, parent ID: 0)
| |-- grandchild1 (ID: 2, parent ID: 1)
| +-- grandchild2 (ID: 4, parent ID: 1)
+-- child2 (ID: 3, parent ID: 0)
| +-- grandchild3 (ID: 6, parent ID: 3)
+-- child3 (ID: 5, parent ID: 0)
때로는 예외를 발생시켜야 하는 경우가 있어요. 이렇게 할 때는 오류의 원인이 무엇인지 알려 주는 의미 있는 오류 메시지를 항상 함께 넣어야 해요. 그래야 코드가 더 읽기 쉬워지고 디버깅에 큰 도움이 돼요. 오류의 원인이 특정 유형일 것이라고 알고 있는 상황이라면 내장 오류 유형 중 하나를 발생시켜도 되지만, 그래도 의미 있는 메시지는 함께 넣어야 해요.
이 연습 문제에서는 잘못된 트리 입력에 대해 ValueError를 "던지도록" raise 문이 사용되는 방식과 위치를 리팩터링해야 해요. 테스트는 코드가 적절한 exception을 raise하면서 그에 맞는 메시지도 함께 포함할 때만 통과해요.
Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.