아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

트리 부호화

면접 대비

시간 제한1초메모리 제한128 MB

요약
괄호로 표현된 트리를 파싱한 뒤, 번호가 가장 작은 리프를 반복해서 제거하며 이웃 번호를 출력해 프뤼퍼 코드를 만든다.
난이도

보통10점 중 5점

유형
트리, 구현, 시뮬레이션, 그리디
정답자
아직 제출이 없습니다

문제

정수 1,2,…,n1, 2, \ldots, n 으로 정점에 번호가 매겨진 트리(사이클이 없는 연결 그래프)가 주어진다. 이 트리의 프뤼퍼(Prufer) 코드는 다음과 같이 만든다.

  • 번호가 가장 작은 잎(정확히 하나의 간선에만 연결된 정점)을 고른다.
  • 이 잎과 그에 연결된 간선을 함께 제거하고, 그 잎과 인접해 있던 정점의 번호를 기록한다.
  • 남은 그래프에서 정점이 하나만 남을 때까지 이 과정을 반복한다(마지막에 남는 정점의 번호는 항상 nn 이다).

이렇게 기록된 n−1n - 1 개의 수열이 이 트리의 프뤼퍼 코드이다.

주어진 트리의 프뤼퍼 코드를 계산하여라. 트리는 다음 문법으로 정의되는 언어의 문자열로 표현된다.

T ::= "(" N S ")"
S ::= " " T S
    | empty
N ::= number

즉, 트리는 괄호로 둘러싸이며, 먼저 루트 정점의 번호를 나타내는 수가 오고, 그 뒤에 임의 개수(0개일 수도 있음)의 서브트리가 각각 하나의 공백 문자로 구분되어 이어진다.

이 정의에 따르면 트리의 루트 자체가 잎일 수도 있다. 루트를 정하는 것은 표기의 편의를 위한 것일 뿐이며, 실제로 다루는 것은 뿌리 없는(unrooted) 트리이다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 위 형식으로 표현된 하나의 트리를 한 줄에 담고 있다. 입력은 파일의 끝(EOF)에서 종료된다. 1≤n≤501 \le n \le 50 임을 가정해도 좋다.

출력

각 테스트 케이스마다 해당 트리의 프뤼퍼 코드를 한 줄에 출력한다. 수와 수 사이는 하나의 공백으로 구분하며, 줄 끝에는 공백을 출력하지 않는다. n=1n = 1 인 경우 코드가 비어 있으므로 해당 테스트 케이스에는 빈 줄을 출력한다.

예제1

  1. 예제 1

    입력
    (2 (6 (7)) (3) (5 (1) (4)) (8))
    (1 (2 (3)))
    (6 (1 (4)) (2 (3) (5)))
    
    예상 출력
    5 2 5 2 6 2 8
    2 3
    2 1 6 2 6