C 프로그래밍에서 미리 정의된 값을 가진 네 개의 변수 a, b, c, d가 주어지며, 어떤 변수가 사용되었는지에 따라 해당하는 괄호를 출력해야 합니다.
각 변수가 나타내는 괄호는 다음과 같습니다.
a → (( b → () c → )( d → ))
과제는 주어진 모든 괄호를 사용하여 균형 잡힌(balanced) 괄호 표현식을 만들어 출력하는 것입니다. 만약 균형 잡힌 표현식을 만들 수 없다면 -1을 출력합니다. 가능한 답이 여러 개일 경우에는 그중 아무거나 하나를 출력하면 됩니다.
예시
입력: a = 3, b = 2, c = 4, d = 3 출력: ((((((()()()()())))))()()
접근 방법
가장 먼저 주어진 개수의 괄호로 균형 잡힌 표현식을 만들 수 있는지 확인해야 합니다. 여는 괄호의 총 개수는 2×a + c개이고, 닫는 괄호의 총 개수는 c + 2×d개이므로 두 값이 같아야 균형이 맞습니다. 즉, a와 d가 같은 경우(단, a가 0이 아닐 때) 또는 a = c = d = 0인 경우(자체적으로 균형이 맞는 b의 "()"만 남는 경우)에만 표현식을 완성할 수 있습니다.
조건을 만족한다면 다음 순서대로 출력합니다.
- 첫 번째 유형의 괄호 "((" 를 a번 출력
- 세 번째 유형의 괄호 ")(" 를 c번 출력
- 네 번째 유형의 괄호 "))" 를 d번 출력
- 두 번째 유형의 괄호 "()" 를 b번 출력
이 순서대로 배치하면 앞부분에 여는 괄호가 충분히 나오고, 뒷부분의 닫는 괄호가 이를 모두 닫아주기 때문에 문자열 전체가 항상 균형을 이루게 됩니다.
알고리즘
START
Step 1 -> 함수 void print(int a, int b, int c, int d) 선언 및 int i 선언
IF ((a == d && a) || (a == 0 && c == 0 && d == 0))
i=1부터 i<=a까지 반복하며 "((" 출력
i=1부터 i<=c까지 반복하며 ")(" 출력
i=1부터 i<=d까지 반복하며 "))" 출력
i=1부터 i<=b까지 반복하며 "()" 출력
ELSE
"can't be formed" 출력
Step 2 -> main()
int a = 3, b = 2, c = 4, d = 3 선언
print(a, b, c, d) 호출
STOP
C 구현 예제
#include<stdio.h>
void print(int a, int b, int c, int d){
int i;
if ((a == d && a) || (a == 0 && c == 0 && d == 0)){
for (i = 1; i <= a; i++)
printf("((");
for (i = 1; i <= c; i++)
printf(")(");
for (i = 1; i <= d; i++)
printf("))");
for (i = 1; i <= b; i++)
printf("()");
}
else
printf("can't be formed");
}
int main(){
int a = 3, b = 2, c = 4, d = 3;
print(a, b, c, d);
return 0;
}
출력 결과
위 프로그램을 실행하면 다음과 같은 결과가 생성됩니다.
(((((()()()()())))))()()