9012: 괄호

2022. 4. 3. 14:32C언어/백준

-Class2 : Silver 4

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

 

9012번: 괄호

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

www.acmicpc.net

 

-결과

 

-코드

#include <stdio.h>
#include <string.h>
    int main(void) {
        int n;
        char a[60];
        char k = '(';  // ( = 1
        char l = ')';  // ) = -1
        int m; //괄호가 1개씩 추가될 때마다 계산한 합
        int res; //최종합
        int len;
        
        scanf("%d", &n);
        for (int i=0; i<n; i++) {
            scanf("%s", a);
            m=0;
            len = strlen(a);
            for(int j=0; j<len; j++) {
                if (a[j] == '(') {
                    m+=1;
                }
                else if (a[j] == ')') {
                    m -= 1;
                }

                if (m<0) {
                    break;
                }
            }
            if (m==0) {
                printf("YES\n");
            }
            else {
                printf("NO\n");
            }
        }    
    }

 

-풀이

이 문제는 괄호가 제대로 된 순서로 잘 쓰였나에 관한 것이다.

하나의 괄호 문자열의 길이는 2 이상 50 이하이다. 

라고 문제에 주어졌기 때문에 넉넉잡아서 배열의 크기를 60으로 잡는다.

그리고 계산하기 편하게 하기 위해서 '(' 기호를 +1로 생각하고, ')' 기호를 -1이라고 가정하고 출발한다.

 먼저 몇 줄을 입력받을 건지를 입력받고, for문으로 각 줄마다 검사를 반복한다.

괄호로 쓰인 줄을 배열로 입력받는다.

 

strlen함수는 배열을 입력받아서 배열의 끝에 저장된 \0문자까지 문자들의 개수를 하나 하나 세는 함수이다. 즉, 문자열의 길이를 반환하는 함수이다.

이 strlen 함수를 이용해서 입력받은 문자열 a의 길이를 세고, 그 문자열 a 내에서 '('와 ')'를 1과 -1로 세서 총 합(m)이 0보다 작을 시에는  VPS가 아니라고 판단하도록 하는 for문을 실행한다.

 '()'나 ')('나 ')))(((' 모두 총 합이 0이다. 그런데 합이 0이더라도 ')('와 ')))((('는 괄호의 순서가 틀리기 때문에 VPS가 아니다. 이런 경우도 잡아내기 위해서 문자열 a에서 괄호가 하나씩 추가될 때마다 바로 총 합(m)을 계산하여, m이 0보다 작아지는 순간이 있으면 for문을 바로 벗어나도록 break를 건다.

모든 줄의 문자열 계산이 끝나면 if문으로 만약 총 합이 0이라면 YES를 출력하도록 하고, 아니라면 NO를 출력하도록 한다.

'C언어 > 백준' 카테고리의 다른 글

1436: 영화감독 숌  (0) 2022.05.01
1181: 단어 정렬  (0) 2022.05.01
1018: 체스판 다시 칠하기  (0) 2022.05.01
10773: 제로  (0) 2022.04.03
1094번: 막대기  (0) 2022.04.03