본문 바로가기
알고리즘/백준

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

by 이민훈 2021. 3. 2.

www.acmicpc.net/problem/9012

 

9012번: 괄호

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

www.acmicpc.net

흔히 쓰는 괄호가 제대로 열리고 닫혔는지 판단하는 문제입니다. '('가 push, ')'가 pop이라고 생각하면 풀기 수월한 문제입니다. 즉 스택이 비었을때 pop을 하거나 push, pop이 끝난 스택의 사이즈가 0이 아니면 vps가 아닙니다. 그것을 코드로 구현하면.. 아래와 같은 함수를 만들 수 있습니다.

void vps(string str, int len)
{
    int stack = 0;
    for (int j = 0; j < len; j++) {
        if (stack == -1) {
            cout << "NO" << endl;
            return;
        }
        if (str[j] == '(') stack++;
        else stack--;
    }
    if (stack != 0) cout << "NO" << endl;
    else cout << "YES" << endl;
}

int main(void)
{
    int t; cin >> t;
    
    for (int i = 0; i < t; i++) {
        string str; cin >> str;
        int len = str.length();
        if (len % 2 == 0) vps(str, len);
        else cout << "NO" << endl;
    }

    return 0;
}

문자열을 입력받고 길이가 2의 배수가 아니라면 바로 "NO"를 출력합니다. '('와 ')'는 서로 짝이 필요하기 때문에 길이가 홀수라면 vps가 아닐 수밖에 없습니다. 그런 다음 문자열의 각 인덱스(문자)에 접근하여 '('라면 정수를 증가시켜주고 ')'라면 감소시켜줍니다. 문자열을 도는 도중 한 번이라도 정수가 마이너스가 된다면 '('와 ')'는 무조건 '('이 먼저 오는 형태가 되어야 하므로 vps가 아닙니다. 즉 (()))(과 같은 문자열이 입력되었을 때 문자열을 도는 도중 정수가 마이너스가 됩니다. 모든 문자열을 다 돈 후, 정수가 0이 아니라면 짝이 안 맞았다는 소리이므로 "NO"를 출력해주면 됩니다.

댓글