페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#10360

중첩 깊이 20s 1024MB

문제

tl;dr: 숫자 문자열 S가 주어질 때, 최소 개수의 여는 괄호와 닫는 괄호를 삽입하여 결과 문자열이 균형잡히고(balanced), 각 숫자 d가 정확히 d쌍의 매칭 괄호 안에 있도록 만들어라.

문자열에서 두 괄호 사이의 중첩(nesting)은 그 둘 사이에 엄격히 포함되는 부분 문자열을 의미한다. 어떤 여는 괄호와 그 오른쪽에 있는 어떤 닫는 괄호는, 그 둘의 중첩이 비어 있거나, 혹은 중첩 안에 있는 모든 괄호가 중첩 안의 다른 괄호와 매칭된다면 서로 매칭된다(match)고 한다. 어떤 위치 p의 중첩 깊이(nesting depth)는, p가 그 매칭 쌍의 중첩 안에 포함되는 매칭 괄호 쌍의 개수이다.

예를 들어 다음 문자열들은 모든 숫자가 자신의 중첩 깊이와 일치한다: 0((2)1), (((3))1(2)), ((((4)))), ((2))((2))(1). 처음 세 문자열은 같은 숫자들이 같은 순서로 들어가는 문자열들 중 길이가 최소이지만, 마지막 문자열은 그렇지 않다. ((22)1)도 숫자 221를 포함하면서 더 짧기 때문이다.

숫자 문자열 S가 주어질 때, 괄호와 숫자로만 이루어진 또 다른 문자열 S'를 찾아라. S'는 다음을 만족해야 한다:

  • S'의 모든 괄호는 어떤 다른 괄호와 매칭된다.
  • S'에서 모든 괄호를 제거하면 S가 된다.
  • S'의 각 숫자는 자신의 중첩 깊이와 같다.
  • S'의 길이는 최소이다.


입력

입력의 첫 줄에는 테스트 케이스 수 T가 주어진다. 이어서 T줄이 주어지며, 각 줄이 하나의 테스트 케이스를 나타내고 문자열 S만 포함한다.


출력

각 테스트 케이스마다 Case #x: y 형식의 한 줄을 출력하라. 여기서 x는 (1부터 시작하는) 테스트 케이스 번호이고, y는 위에서 정의한 문자열 S'이다.


예제

4
0000
101
111000
1
Case #1: 0000
Case #2: (1)0(1)
Case #3: (111)000
Case #4: (1)
문자열 ()0000(), (1)0(((()))1), (1)(11)000은 각각 샘플 케이스 #1, #2, #3의 해가 아니다. 다만 그것은 최소 길이가 아니기 때문일 뿐이다. 또한 1)( 와 )(1 은 샘플 케이스 #4의 해가 아니다. 괄호가 짝이 맞지 않고, 1이 있는 위치에서 중첩 깊이가 0이기 때문이다. 문제 설명에 나온 예시 문자열들에서 괄호를 제거하면 테스트 세트 2에서만 유효한 샘플 입력을 만들 수 있다.

출처

GCJ 2020qr B

로그인해야 코드를 작성할 수 있어요.