트리 접붙이기
면접 대비시간 제한1초메모리 제한128 MB
순서 트리의 깊이 우선 탐색 문자열이 주어질 때, 원래 트리의 높이와 왼쪽 자식/오른쪽 형제 이진 트리로 변환한 뒤의 높이를 구한다.
문제
트리는 컴퓨터 과학에서 다양하게 쓰인다. 가장 흔히 쓰이는 것은 루트 있는 이진 트리이지만, 다른 종류의 루트 트리도 유용할 수 있다. 그 예로 순서 트리(ordered tree) 가 있는데, 이 트리에서는 각 노드의 부분 트리들에 순서가 매겨져 있다. 각 노드의 자식 수는 정해져 있지 않으며 상한도 없다. 형식적으로, 순서 트리는 다음을 만족하는 유한한 노드 집합 로 이루어진다.
- 한 노드가 루트로 지정되며, 이를 root() 로 나타낸다.
- 나머지 노드들은 부분집합 으로 분할되고, 각 부분집합 역시 하나의 트리(부분 트리)이다.
또한 root(), ..., root() 을 root() 의 자식으로 정의하며, root() 가 번째 자식이다. root(), ..., root() 은 서로 형제(sibling)이다.
모든 노드를 같은 크기의 공간에 저장할 수 있도록, 순서 트리를 루트 있는 이진 트리로 표현하는 것이 더 편리한 경우가 많다. 변환은 다음 단계로 이루어진다.
- 각 노드에서 자식으로 가는 간선을 모두 제거한다.
- 각 노드에 대해, 에서의 첫 번째 자식(있다면)으로 가는 간선을 왼쪽 자식으로 추가한다.
- 각 노드에 대해, 에서의 다음 형제(있다면)로 가는 간선을 오른쪽 자식으로 추가한다.
아래 그림이 이 과정을 보여 준다.
0 0
/ | \ /
1 2 3 ===> 1
/ \ \
4 5 2
/ \
4 3
\
5
대부분의 경우 변환 후 트리의 높이(루트에서 잎까지의 경로 중 가장 긴 것의 간선 수)가 늘어난다. 많은 트리 알고리즘의 수행 시간이 높이에 의존하므로 이는 바람직하지 않다.
변환 전과 변환 후의 트리 높이를 계산하는 프로그램을 작성하라.
입력
입력은 여러 줄로 주어지며, 각 줄은 한 트리를 깊이 우선 순회(DFS)하면서 이동한 방향을 나타낸다. 트리 하나당 한 줄이다. 예를 들어 위 그림의 트리는 dudduduudu 로 표현되는데, 이는 "0에서 1로 내려가고, 1에서 0으로 올라오고, 0에서 2로 내려가고, ..." 를 뜻한다. 즉 d 는 자식으로 내려가는 것을, u 는 부모로 올라오는 것을 의미한다. 입력은 첫 글자가 # 인 줄로 끝난다. 각 트리의 노드 수는 2개 이상 10000개 이하이다.
출력
각 트리에 대해, 위에서 설명한 변환 전과 변환 후의 트리 높이를 다음 형식으로 출력하라.
Tree t: h1 => h2
여기서 는 (1부터 시작하는) 트리 번호, 은 변환 전 높이, 는 변환 후 높이이다.