본문 바로가기

개발 언어 및 알고리즘 기초/C언어로 푸는 백준

[백준 9012번/C언어] 괄호 풀이

백준 9012번 문제를 풀어보았습니다. 

백준 9012번: https://www.acmicpc.net/problem/9012

 

9012번: 괄호

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

www.acmicpc.net

 

문제 내용은 아래와 같습니다. 

 

 

 예전에 유사한 문제를 아주 어렵게 풀었던 기억이 있는데, 이번에는 보다 쉽게 푼 것 같아서 뿌듯했습니다. 문제 자체가 복잡한 알고리즘을 사용해야 하는 게 아닌데 지난번엔 왜 그렇게 어렵게 풀었나 싶지만 발전했다는 것에 만족하기로 했습니다. 아마 지난번에는 stack과 queue 개념을 배워서 나름 적용해보려 하다 보니 더 복잡하게 푼 게 아닌가 싶습니다. 활용한 풀이도 조만간 올려볼 수 있다면 올려보도록 하겠습니다. 

 

 문제에서 이야기한 대로 괄호가 올바르게 구성되어 있는지 체크하는 프로그램을 만드는 것이 목표입니다. 또, 문제에서 괄호도 한 종류밖에 없어서 더 쉽게 접근이 가능합니다. 

 바로 코드 설명으로 넘어가면, 두 개의 함수로 구성했습니다. main 함수와 helper function에 해당하는 isVPS() 함수입니다. main 함수에서는 문제에서 제시한 문자열 갯수인 t를 입력받고 그만큼 반복문을 돌리면서 해당 문자열이 VPS인지 아닌지 체크하는 isVPS() 함수를 실행시킵니다. 문제에서 괄호 문자열 길이를 2 이상 50 이하라고 지정해 줬기 때문에, 문자열 길이를 넉넉잡아 55로 잡고 string으로 입력받는 방식을 택하였습니다. 문자열 길이가 주어져있지 않아도 문자를 하나하나 입력받으면서 체크할 수 있긴 합니다. 다만 버퍼 문제로 c를 비우지 않고 쓰면 문제가 발생할 수 있기 때문에 안전한 문자열로 입력받는 방식을 택했습니다. 아무튼 결과적으로 VPS함수임이 판명 나면 "YES"를 아니면 "NO"를 출력하고 다음으로 넘어갑니다. 

 isVPS() 함수는 문자열을 입력받아 해당 문자열이 VPS이면 1을, 아니면 0을 리턴합니다. 판단하는 방식은 while문으로 입력받은 문자열을 순회하면서 여는 괄호가 나오면 open 변수에 1을 더하고, 닫는 괄호가 나오면 open 변수에 1을 빼서 마지막에 open 변수가 0인지 체크하는 것입니다. open 변수가 0이라는 것은 여는 괄호와 닫는 괄호의 수가 같다는 뜻이므로 올바른 괄호 구성이 됩니다. 다만, 여는 괄호보다 닫는 괄호가 먼저 나오면 안되기 때문에, 순회 도중 현재 문자가 닫힌 괄호인데 open 변수가 0이라면 바로 0을 리턴하며 함수를 종료시켜 줍니다. 

#include <stdio.h>

int isVPS(char ps[55]) {
    int j = 0, open = 0;
    
    while (ps[j]) {
        if (ps[j] == '(') {
            open++;
        } else if (ps[j] == ')') {
            if (open == 0)
                return 0;
            open--;
        }
        j++;
    }
    if (open == 0)
        return 1;
    else
        return 0;
}

int main() {
    int t;
    scanf("%d", &t);
    
    char ps[55];
    for (int i = 0; i < t; i++) {
        scanf("%s", ps);
        if (isVPS(ps))
            printf("YES\n");
        else
            printf("NO\n");
    }
}

 

728x90