본문 바로가기

프로그래밍/PS

[C++] 백준 9012번: 괄호

반응형

9012번: 괄호

이번 문제에서는 주어진 문자열에서 괄호의 세트가 잘 맞춰져 있는가를 검증해야 한다.

즉, 닫힌 괄호로 시작하거나 열린 괄호로 끝나면 "NO"를 출력해야 한다.

그 외에도 닫힌 괄호가 충분하지 않거나 그 반대의 경우도 있겠다.

이런 경우를 하나하나 생각하기엔 복잡하니, 다음과 같이 생각을 간소화 할 있다.

열린괄호는 +1, 닫힌괄호는 -1로 생각하는거다.

처음에는 0으로 시작하여 문자열을 처음부터 스캔해 나간다.

만약 그 과정에서 음수가 되면 명백하게 "NO"다.

왜냐하면 닫힌 괄호가 앞에서 더 많이 나왔기 때문이다.

"(()))"이런 경우다.

스캔이 다 끝나면 다시 0으로 돌아와야 한다.

+1과 -1의 쌍이 하나씩 매칭되기 떄문이다.

만약 0이 아니면 "NO", 0이면 "YES"다.

#include <iostream>

using namespace std;

int main() {
	int T;
	scanf("%d", &T);
	char PS[51];
	while (T--) {
		scanf("%s", PS);
		int balance = 0;
		for (int i = 0; PS[i] != 0; i++) {
			if (PS[i] == '(')
				balance++;
			else
				balance--;
			if (balance < 0) {
				printf("NO\n");
				goto NEXT_TEST;
			}
		}
		if (balance != 0)
			printf("NO\n");
		else
			printf("YES\n");
	NEXT_TEST:;
	}
	return 0;
}

또한 이번에 처음 알게된 사실이 있다.

goto문과 쌍을 이루는 라벨 다음에 아무 문장이 없으면 VS에서 컴파일 오류가 난다.

그래서 라벨을 붙일 땐 문장 앞에 붙이거나 라벨 다음에 세미콜론을 붙여주면 오류가 안 생긴다.

반응형