#include <stdio.h>
//#define N_MAX 1000
#define N_MAX 11
char arrayC[N_MAX + 1];
int arrayN[N_MAX + 1];
int tempN[N_MAX + 1];
typedef struct {
int a;
int b;
} reverse;
reverse reverseN[10];
int reverseCnt;
void reverseOp(int a, int b) {
for (int i = a; i <= b; i++) {
tempN[i] = arrayN[i];
}
for (int i = b, j = a; i >= a; i--) {
arrayN[j++] = -tempN[i];
}
reverseN[reverseCnt].a = a;
reverseN[reverseCnt].b = b;
reverseCnt++;
}
int main(void) {
freopen("input.txt", "r", stdin);
int test_case;
int T, N;
setbuf(stdout, NULL);
scanf("%d", &T);
for (test_case = 1; test_case <= T; ++test_case) {
scanf("%d %s", &N, arrayC);
if (N % 2 == 1) {
printf("#%d %d\n", test_case, -1);
continue;
}
else if (N == 0) {
printf("#%d %d\n", test_case, 0);
continue;
}
for (int i = 0; i < 10; i++) {
reverseN[i].a = 0;
reverseN[i].b = 0;
reverseCnt = 0;
}
for (int i = 0; i < N; i++) {
if (arrayC[i] == '(') arrayN[i] = 1;
else arrayN[i] = -1;
}
// 가장 낮은 값을 찾아서 전부 +Y 로 그래프가 되도록 변경
int sum = 0;
int max = 0;
int max_i = -1;
for (int i = 0; i < N; i++) {
sum += arrayN[i];
if (sum < 0 && max > sum) {
max = sum;
max_i = i;
}
}
// 반전 시키자
if (max_i != -1) {
reverseOp(0, max_i);
}
// 최종 높이를 구하자
int back_sum = 0;
int back_height = 0;
for (int i = 0; i < N; i++) {
back_sum += arrayN[i];
}
back_height = back_sum / 2;
if (back_height == 0) {
printf("#%d %d\n", test_case, 0);
continue;
}
else if (back_height == 1) {
for (int i = N - 1; i >= 0; i--) {
if (arrayN[i] == 1) {
reverseOp(i, i);
break;
}
}
}
else {
back_sum = 0;
for (int i = N - 1; i >= 0; i--) {
back_sum += arrayN[i];
if (back_sum == back_height) {
reverseOp(i, N - 1);
break;
}
}
}
printf("#%d %d\n", test_case, reverseCnt);
for (int i = 0; i < reverseCnt; i++) {
printf("%d %d\n", reverseN[i].a, reverseN[i].b);
}
}
return 0;
}
댓글