// 描述
// 给出一个正整数n,请给出所有的包含n个'('和n个')'的字符串,使得'('和')'可以完全匹配。
// 例如:
// '(())()','()()()' 都是合法的;
// '())()('是不合法的。
// 请按照__字典序__给出所有合法的字符串。
// 输入描述:
// 输入为1个正整数
// 输出描述:
// 输出为所有合法的字符串,用英文逗号隔开
// 示例1
// 输入:
// 2
// 复制
// 输出:
// (()),()()
//算法不对
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    while(line = await readline()){
        let n=Number(line)//n对括号  2n个括号
        let res= growth(2*n)
        //console.log(res)
        let pt= res.filter(v=>check(v) )
        console.log(pt.join(","))
    }
}()
// 多情况递归 需要用数组
function growth(n){
    let tmp=[]
   if(n==1){
        tmp.push("(")
        tmp.push(")")
   }
   else if(n){
       let pre=growth(n-1)
       pre.forEach(v=>{
           tmp.push(v+"(")
           tmp.push(v+")")
       })
   }
   return tmp
}

function check(str){
    if(str==""){return false}
    let rt=0;
    for(let i=0;i<str.length;i++){
        if(str[i]=="("){
            rt++
        }else if(str[i]==")"){
            rt--
        }
        if(rt<0){ return false;} //提前多出现) 报错
    }
    
    if(rt==0){ return true;} //整好配对
    else{ return false;}  //左右不配对
}

遍历所有括号情况 n对括号就是2n个括号每个括号要么是'(' 要么是')' 罗列所有情况,然后利用过滤函数判断哪些是正确的括号序列。提前出线右括号是错误序列,匹配结束后左右括号个数不相等时错误序列