본문 바로가기
백준

백준 9012번[c언어] : 괄호

by 핫동경 2022. 5. 3.
반응형

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

 

9012번: 괄호

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

www.acmicpc.net


풀이
  • 스택 문제에 있어서 스택을 써서 사용해야 하나 싶지만 구지 스택을 사용하지 않고도 풀 수 있다.
  • c언어로 스택을 구현하기엔 너무 코드가 길기 때문에 스택을 쓰고싶다면 c++의 stack라이브러리를 사용하도록 하자
  • 스택의 개념으로 먼저 다가가면 '(' 를 push로 생각하고 ')'을 pop으로 생각할 수 있다.
  • 완변한 괄호가 되려면 스택의 상태는 0이 되어야한다. 스택에 무언가 남아있다면 완전한 괄호가 아니다.
  • 위 개념을 생각하면 우선 '(' 와 ')' 의 개수는 같아야한다.
  • (가 나올때마다 count1변수 ++ 을 해준다
  • )가 나올때마다 count2변수 ++을 해준다
  • 문자열의 수만큼 반복문을 돌면서 count2가 count1보다 커지는 순간 그 괄호는 완전한 괄호가 아니다.
  • count1이 더 클 경우도 있으니 printf문에 조건을 걸었다.
  • 반복문(for)이 종료되고 count1이 count2와 같으면 완전한 괄호이니 YES를 출력하고 그렇지 안다면 NO를 출력
#include<stdio.h>
#include<string.h>
int main() {
    char buf[51];
    int ntest;
    int count1, count2;
    scanf("%d", &ntest);
    while (ntest--) {
        scanf("%s", buf);
        int len = strlen(buf);
        count1 = count2 = 0;
        for (int i = 0; i < len; i++) {
            if (buf[i] == '(')
                count1++;
            else if (buf[i] == ')')
                count2++;
            if (count2 > count1)
                break;
        }
        printf("%s\n", count1 == count2 ? "YES" : "NO");
    }
}
반응형

댓글