문제 정의
수식에서 괄호를 제거하여 더 간단한 형태의 표현식을 만드는 프로그램을 작성해 보겠습니다.
해결 방법
예제 1
입력 (괄호가 포함된 문자열 수식):
(x+y)+(z+q)
출력:
x+y+z+q
예제 2
입력:
(x-y+z)-p+q
출력:
x-y+z-p+q
알고리즘
주어진 입력 문자열에서 괄호를 제거하기 위한 알고리즘은 다음과 같습니다.
1단계: 필요한 변수를 선언하고, 실행 시점에 사용자로부터 문자열을 입력받습니다.
2단계: 문자열의 처음부터 끝까지 한 글자씩 순회합니다.
3단계: 입력 문자열의 각 문자를 새로운 문자열에 복사합니다.
4단계: 순회 중 여는 괄호 '(' 또는 닫는 괄호 ')'를 만나면 해당 문자는 새 문자열에 복사하지 않고 건너뜁니다. 특히 앞 문자가 '-'인 여는 괄호를 만나면, 괄호 내부의 '+'와 '-' 연산자의 부호를 반전시켜 복사합니다.
구현 예제
다음은 주어진 입력 문자열에서 괄호를 제거하는 C 프로그램입니다.
#include<stdio.h>
int main(){
int i=0,c=0,j=0;
char a[100],b[100];
printf("\nEnter the string :");
scanf("%s",a);
while(a[i]!='\0'){
if((a[i]=='(') && (a[i-1]=='-')){
(c=0)?j=i:j=c;
while(a[i]!=')'){
if(a[i+1]=='+')
b[j++]='-';
else if(a[i+1]=='-')
b[j++]='+';
else if(a[i+1]!=')')
b[j++]=a[i+1];
i++;
}
c=j+1;
}
else if(a[i]=='(' && a[i-1]=='+'){
(c==0)?j=i:j=c;
while(a[i]!=')'){
b[j++]=a[i+1];
i++;
}
j–;
c=j+1;
}
else if(a[i]==')'){
i++;
continue;
} else {
b[j++]=a[i];
}
i++;
}
b[j]='\0';
printf("%s",b);
return 0;
}
실행 결과
위 프로그램을 컴파일하고 실행하면 다음과 같은 결과를 확인할 수 있습니다.
Enter the string:(x+y)-z
x+y-z
이 프로그램은 '-' 기호 뒤에 오는 괄호의 경우 내부 항들의 부호를 반전시켜 처리하고, '+' 기호 뒤에 오는 괄호나 독립적인 괄호는 단순히 괄호만 제거하는 방식으로 동작합니다. 이를 통해 괄호가 제거되면서도 원래 수식의 의미가 그대로 유지됩니다.