만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

괄호 최소화

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

요약
구멍이 있는 산술 템플릿이 주어질 때, 구멍에 실수를 넣는 모든 유효한 값에 대해 결과가 같도록 괄호를 최대한 제거한 템플릿을 구한다.
난이도

어려움10점 중 9점

유형
문자열, 구현, 스택, 수학
정답자
아직 제출이 없습니다

문제

사칙연산 기호와 괄호, 그리고 빈칸을 나타내는 x로만 이루어진 산술식 템플릿 ww가 있다. 예를 들어 (x*x)/(x+x)는 올바른 템플릿이다.

템플릿의 대입이란 빈칸마다 실수를 하나씩 넣어 식의 값이 정의되도록 만드는 것이다. 위 템플릿의 빈칸에 왼쪽부터 1, 2, 3, 4를 넣으면 식의 값은 (1×2)/(3+4)=2/7(1 \times 2)/(3+4) = 2/7이다. 1, 2, 3, -3을 넣으면 분모가 0이 되어 값이 정의되지 않으므로 이것은 대입이 아니다.

두 템플릿 ww와 w′w'가 다음 세 조건을 모두 만족하면 두 템플릿은 동치이다.

  • 두 템플릿의 대입 집합이 같다.
  • 모든 대입에서 두 식의 값이 같다.
  • 한 템플릿에서 괄호 몇 개를 지워 다른 템플릿을 얻을 수 있다.

(x*x)/(x+x)와 x*x/(x+x)는 동치이다. 반면 (x*x)/(x+x)와 x*x/x+x는 1, 2, 3, 4를 대입한 값이 각각 2/72/7과 14/314/3이므로 동치가 아니다. x-(x-x)와 x-x+x도 동치가 아니다. 괄호만 지워서는 한쪽에서 다른 쪽을 얻을 수 없기 때문이다.

주어진 템플릿과 동치인 템플릿 가운데 괄호가 가장 적은 것을 구하여라.

곱셈과 나눗셈의 우선순위는 서로 같고, 덧셈과 뺄셈보다 높다. 따라서 곱셈과 나눗셈을 덧셈과 뺄셈보다 먼저 계산한다. 덧셈과 뺄셈의 우선순위도 서로 같다. 우선순위가 같은 연산은 왼쪽부터 차례로 계산한다.

입력

첫째 줄에 템플릿의 개수 nn이 주어진다. 다음 nn개 줄에 템플릿이 한 줄에 하나씩 주어진다. 각 템플릿은 비어 있지 않고 문법에 맞으며, +, -, *, /, (, ), x 문자로만 이루어진다. 여기서 x는 빈칸이다. 모든 템플릿의 길이의 합은 10610^6 이하이다.

출력

nn개의 줄을 출력한다. ii번째 줄에는 입력의 ii번째 템플릿과 동치인 템플릿 가운데 괄호가 가장 적은 것을 출력한다. 이 템플릿은 유일하다.

예제1

  1. 예제 1

    입력
    2
    x+(x+(x+x)-(x*x))/x
    (x*x)/((x*x))+(x)
    
    예상 출력
    x+(x+x+x-x*x)/x
    x*x/(x*x)+x