반응형

www.acmicpc.net/problem/2504

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.  만일

www.acmicpc.net

 

[ 한국정보올림피아드 2008년 지역본선 중등부 괄호의 값 입출력 데이터 ]

2008년 지역본선 괄호의 값 입출력데이터.zip
0.01MB

 

[ 한국정보올림피아드 2008년 지역본선 중등부 괄호의 값 소스 코드 ]

paren.cpp
0.00MB

#include <stdio.h>
#include <string.h>
char a[33],stack[33];
bool check;
int l,top,b[33];
int main()
{
	int i,j;

	scanf("%s",a);
	l=strlen(a);
	
	for(i=0;i<l;i++)
	{
		if(a[i]=='(')
			stack[top++]='(';
		if(a[i]=='[')
			stack[top++]='[';
		if(a[i]==')')
		{
			if(stack[top-1]=='(')
				stack[--top]=0;
			else
				break;
		}
		if(a[i]==']')
		{
			if(stack[top-1]=='[')
				stack[--top]=0;
			else
				break;
		}
		if(top<0)
			break;
	}
	
	if(top!=0 || i!=l)
	{
		printf("0\n");
		return 0;
	}
	
	for(i=0;i<l;i++)
	{
		if(a[i]=='(')
			b[i]=-1;
		if(a[i]==')')
			b[i]=-2;
		if(a[i]=='[')
			b[i]=-3;
		if(a[i]==']')
			b[i]=-4;
	}
	check=true;
	while(check)
	{
		check=false;
		for(i=0;i<l-1;i++)
		{
			if(b[i]==-1 && b[i+1]==-2)
			{
				b[i]=2;
				for(j=i+1;j<l-1;j++)
					b[j]=b[j+1];
				b[l-1]=0;
				l--;
				check=true;
				break;
			}
			if(b[i]==-3 && b[i+1]==-4)
			{
				b[i]=3;
				for(j=i+1;j<l-1;j++)
					b[j]=b[j+1];
				b[l-1]=0;
				l--;
				check=true;
				break;
			}
		}
	}
	check=true;
	while(check)
	{
		check=false;
		for(i=0;i<l-1;i++)
		{
			if(0<b[i] && 0<b[i+1])
			{
				b[i]=b[i]+b[i+1];
				for(j=i+1;j<l-1;j++)
					b[j]=b[j+1];
				b[l-1]=0;
				l--;
				check=true;
				break;
			}
			if(b[i]==-1 && 0<b[i+1] && b[i+2]==-2)
			{
				b[i]=b[i+1]*2;
				for(j=i+1;j<l-2;j++)
					b[j]=b[j+2];
				b[l-2]=b[l-1]=0;
				l-=2;
				check=true;
				break;
			}
			if(b[i]==-3 && 0<b[i+1] && b[i+2]==-4)
			{
				b[i]=b[i+1]*3;
				for(j=i+1;j<l-2;j++)
					b[j]=b[j+2];
				b[l-2]=b[l-1]=0;
				l-=2;
				check=true;
				break;
			}
		}
	}
	printf("%d\n",b[0]);
	return 0;
}
반응형
Posted by 명문코딩컴퓨터
,