#57. [백준_C언어] 9012 : 괄호

 

 입력 코드 

#include <stdio.h> 
#define MAXSIZE 50

int main() {

	int i, j, cnt, num;
	char arr[MAXSIZE];

	scanf("%d", &num);

	for (j = 0; j < num; j++) {
		cnt = 0;
		scanf("%s", arr);

		for (i = 0; i < MAXSIZE; i++) {
			if (arr[i] == '\0')
				break;

			if (arr[i] == '(')
				cnt++;

			else if (arr[i] == ')' && cnt > 0)
				cnt--;

			else if (arr[i] == ')' && cnt <= 0) {
				cnt--;
				break;
			}
		}

		if (cnt == 0)
			printf("YES\n");

		else
			printf("NO\n");
	}
}

 

출처 jwprogramming.tistory.com/137

 

 

 

 코드 설명 

#자료구조 #문자열 #스택

#include <stdio.h>

main() {
	int T;
	scanf("%d", &T);

	int i;
	char s[52];

	int right = 0, left = 0;

	for (i = 0; i < T; i++) {
		scanf("%s", &s);

		if (s[i] == "(")
			left++;
		else
			right++;

		if (left == right)
			printf("YES\n");
		else
			printf("NO\n");
	}
}

처음에는 '(' 와 ')' 의 개수가 똑같으면  괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)일 거라 생각했지만,

 

예제2의 세 번째 문자열에서 NO가 출력되어 아닌 것임을 알 수 있다.


 

#include <stdio.h>

char stack[50];
int top = 0;

int isVPS(char *);

void push(char);
char pop();
int isEmpty();

main() {
	int t;
	char str[51];

	int i;
	scanf("%d", &t);

	for (i = 0; i < t; i++) {
		scanf("%s", str);

		if (isVPS(str))
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}

int isVPS(char *str) {
	int result = 1;
	int i;

	for (i = 0; str[i]; i++) {
		if (str[i] == '(') {
			push(str[i]);
		}
		else {
			if (isEmpty()) {
				result = 0;
				break;
			}
			else
				pop();
		}
	}
	if (!isEmpty())
		result = 0;
	while (!isEmpty()) {
		pop();
	}
	return result;
}

void push(char c) {
	stack[top++] = c;
}

char pop() {
	return stack[--top];
}

int isEmpty() {
	return top == 0;
}

출처 yahohococo.tistory.com/31

 

 

 

 문제 출처 

www.acmicpc.net/problem/9012

 

9012번: 괄호

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

www.acmicpc.net