Problem:
Score : 400 points

Problem Statement

You are given a string S of length N consisting of ( and ). Your task is to insert some number of ( and ) into S to obtain a correct bracket sequence.

Here, a correct bracket sequence is defined as follows:

() is a correct bracket sequence.

If X is a correct bracket sequence, the concatenation of (, X and ) in this order is also a correct bracket sequence.

If X and Y are correct bracket sequences, the concatenation of X and Y in this order is also a correct bracket sequence.

Every correct bracket sequence can be derived from the rules above.

Find the shortest correct bracket sequence that can be obtained. If there is more than one such sequence, find the lexicographically smallest one.

Constraints

The length of S is N.

1 ≤ N ≤ 100

S consists of ( and ).

Input

Input is given from Standard Input in the following format:

N
S

Output

Print the lexicographically smallest string among the shortest correct bracket sequences that can be obtained by inserting some number of ( and ) into S.

Sample Input 1

3
())

Sample Output 1

(())

Sample Input 2

6
)))())

Sample Output 2

(((()))())

Sample Input 3

8
))))((((

Sample Output 3

(((())))(((())))

Solution in C (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>

/*

(と)しかない、辞書順だから(は左に、)は右に挿入すべき

再帰レベルを(すると+1、)すると-1

(を挿入するとそれ以降の再帰レベルを+1
)を挿入するとそれ以降の再帰レベルを-1

制約: レベル0未満になってはならない
最後のレベルは0でなければならない

すべての区間で再帰レベルが正の数になるように左端に(を挿入
再帰レベルが0になるように右端に)を挿入

 */
int main(void)
{
	int N,n;
	char S[1000];
	scanf("%d\n",&N);
	scanf("%s\n",S);
	int min_rec_level = 0;
	int curr_rec_level = 0;
	for (n=0;n<N;n++){
		if (S[n]=='('){
			curr_rec_level++;
		}
		else if (S[n]==')'){
			curr_rec_level--;
			if (min_rec_level > curr_rec_level)min_rec_level = curr_rec_level;
		}
		else assert(0);
	}
	//printf("%d %d\n",min_rec_level,curr_rec_level);
	int last_rec_level = curr_rec_level;
	int p1_add = 0;
	if (min_rec_level < 0){
		p1_add = -min_rec_level;
		for (n=0;n<p1_add;n++){
			printf("(");
		}
	}
	printf("%s",S);
	int p2_add = p1_add + last_rec_level;
	for (n=0;n<p2_add;n++){
		printf(")");
	}
	return 0;
}