트리 부호화
면접 대비시간 제한1초메모리 제한128 MB
괄호로 표현된 트리를 파싱한 뒤, 번호가 가장 작은 리프를 반복해서 제거하며 이웃 번호를 출력해 프뤼퍼 코드를 만든다.
문제
정수 으로 정점에 번호가 매겨진 트리(사이클이 없는 연결 그래프)가 주어진다. 이 트리의 프뤼퍼(Prufer) 코드는 다음과 같이 만든다.
- 번호가 가장 작은 잎(정확히 하나의 간선에만 연결된 정점)을 고른다.
- 이 잎과 그에 연결된 간선을 함께 제거하고, 그 잎과 인접해 있던 정점의 번호를 기록한다.
- 남은 그래프에서 정점이 하나만 남을 때까지 이 과정을 반복한다(마지막에 남는 정점의 번호는 항상 이다).
이렇게 기록된 개의 수열이 이 트리의 프뤼퍼 코드이다.
주어진 트리의 프뤼퍼 코드를 계산하여라. 트리는 다음 문법으로 정의되는 언어의 문자열로 표현된다.
T ::= "(" N S ")"
S ::= " " T S
| empty
N ::= number
즉, 트리는 괄호로 둘러싸이며, 먼저 루트 정점의 번호를 나타내는 수가 오고, 그 뒤에 임의 개수(0개일 수도 있음)의 서브트리가 각각 하나의 공백 문자로 구분되어 이어진다.
이 정의에 따르면 트리의 루트 자체가 잎일 수도 있다. 루트를 정하는 것은 표기의 편의를 위한 것일 뿐이며, 실제로 다루는 것은 뿌리 없는(unrooted) 트리이다.
입력
입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 위 형식으로 표현된 하나의 트리를 한 줄에 담고 있다. 입력은 파일의 끝(EOF)에서 종료된다. 임을 가정해도 좋다.
출력
각 테스트 케이스마다 해당 트리의 프뤼퍼 코드를 한 줄에 출력한다. 수와 수 사이는 하나의 공백으로 구분하며, 줄 끝에는 공백을 출력하지 않는다. 인 경우 코드가 비어 있으므로 해당 테스트 케이스에는 빈 줄을 출력한다.