반응형
이번 문제에서는 주어진 문자열에서 괄호의 세트가 잘 맞춰져 있는가를 검증해야 한다.
즉, 닫힌 괄호로 시작하거나 열린 괄호로 끝나면 "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에서 컴파일 오류가 난다.
그래서 라벨을 붙일 땐 문장 앞에 붙이거나 라벨 다음에 세미콜론을 붙여주면 오류가 안 생긴다.
반응형
'프로그래밍 > PS' 카테고리의 다른 글
[C++] 백준 2798번: 블랙잭 (0) | 2020.09.20 |
---|---|
[C++] 백준 10250번: ACM 호텔 (0) | 2020.09.20 |
[C++] 백준 1929번: 소수 구하기 (0) | 2020.09.20 |
[C++] 백준 2839번 : 설탕배달 (0) | 2020.09.19 |
[C++] 백준 1654번: 탈출 조건에 대하여 (0) | 2020.09.11 |