프로그래밍/백준(BOJ)

[백준(BOJ) / C][Silver Ⅳ] 9012번 : 괄호

데굴데굴이 2024. 1. 3. 20:01
반응형

문제

https://www.acmicpc.net/problem/9012

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net


풀이

간단한 구현 문제입니다.

괄호 '(' 를 +1, 괄호 ')' 를 -1 이라 하고 해당 괄호를 순서대로 계산을 합니다.

만약 계산도중 0 미만으로 내려가면 괄호가 이상하게 배치됐다는 뜻이므로 플래그를 1로 바꾸며 반복문을 나옵니다.

그리고 0미만으로 내려가지 않더라도 최종 결과가 0이 아니라면 '('가 배치된 만큼 ')'가 배치된것이 아니므로 틀린 배치 입니다.


소스코드

#include <stdio.h>
#include <string.h>

int main(void)
{
	char arr[51];
	int testcase, length, flag = 0,count = 0;
	
	scanf("%d", &testcase);
	
	// testcase만큼 테스트를 실행한다.
	for(int i = 0; i < testcase; i++)
	{
		scanf("%s", arr);
		
		// 입력된 문자열의 길이를 구한다.
		length = strlen(arr);
		
		// 매번 테스트를 시작할때마다 계산된 변수들을 0으로 초기화한다.
		flag = 0;
		count = 0;
		
		// 문자열의 길이만큼 반복한다.
		for(int j = 0; j < length; j++)
		{
			// 해당 배열이 '(' 라면 count에 1을 더한다.
			if(arr[j] == '(')
			{
				 count++;
			}
			// 해당 배열이 ')' 라면 count에 1을 뺸다.
			else if(arr[j] == ')')
			{
				 count--;
			}
			
			// 만약 계산 도중 count가 0 미만이 되면 VPS가 아니기때문에 
			// flag를 1로 바꾼후 반복문에서 빠져나온다.
			if(count < 0)
			{
				flag = 1;
				break;
			}
		}
		
		// 만약 flag가 0이고 count가 0이라면 VPS가 맞기 때문에 'YES'를 출력한다.
		if(flag == 0 && count == 0)
		{
			printf("YES\n");
		}
		// 둘중 하나라도 아니라면 VPS가 아니기때문에 'NO'를 출력한다.
		else
		{
			printf("NO\n");
		}
	}
	
	return 0;
}
반응형