BRACKETS2 문제를 풀어봤는데 오류 케이스가 궁금합니다.

  • furyhunter
    furyhunter

    BRACKETS2 문제입니다.

    stack을 이용한건 아니지만 웬만한 케이스는 다 정상적으로 나오는데 오답으로 표시가 되네요..

    혹시 오류 케이스가 보이시는 분들 조언해주시면 감사하겠습니다.

    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    
    #pragma warning(disable:4996)
    
    char *substring(char *string, int a, int b);
    
    int main(void)
    {
        int C;      //Test Case
        char string[10001];     //입력받을 문자열
        int len = -1;                   //문자열의 길이
        int n = 0;                  //index
        int pair_index;             //짝이 되는 괄호의 index
        int flag = 0;               //0이면 YES, 1이면 NO
    
        scanf("%d", &C);
    
        while (C > 0)
        {
            //일련의 괄호로 이루어진 문장이 주어지는데 ( 와 ), { 와 }, [ 와 ]가 짝이 맞아야함
            //짝과 순서에 맞으면 "YES" 출력, 아니면 "NO" 출력
            //배열을 구성
            //처음부터 차례로 기입
            //닫는 괄호는 바로 다음이거나 맨 마지막.
            //n번째 원소인 여는 괄호에 대해, 닫는 괄호는 n + 1이거나 len - n일듯
            //짝이 맞으면 소거.
            //중간에 짝이 안맞는게 검출되거나 다 지워봤는데 괄호가 남아있으면 NO 출력
            //끝까지 다 지워서 문자열이 비어있게 되면 YES 출력
    
            len = -1;
            flag = 0;
    
            scanf("%s", string);        //문자열 입력
    
            while (len != 0)
            {
                len = strlen(string);       //문자열의 길이를 저장
    
                if (string[n] == '(')
                {
                    if (string[n + 1] == ')')
                        pair_index = n + 1;
                    else if (string[len - n - 1] == ')')
                        pair_index = len - n - 1;
                }
                else if (string[n] == '{')
                {
                    if (string[n + 1] == '}')
                        pair_index = n + 1;
                    else if (string[len - n - 1] == '}')
                        pair_index = len - n - 1;
                }
                else if (string[n] == '[')
                {
                    if (string[n + 1] == ']')
                        pair_index = n + 1;
                    else if (string[len - n - 1] == ']')
                        pair_index = len - n - 1;
                }
                else
                {
                    flag = 1;
                    break;
                }
    
                if (pair_index == n + 1)
                    strcpy(string, substring(string, n + 2, len));
                else if (pair_index == len - n - 1)
                    strcpy(string, substring(string, n + 1, pair_index - 1));
                else
                {
                    flag = 1;
                    break;
                }
    
                len = strlen(string);       //문자열의 길이를 저장
            }
    
            if (flag == 0)
                printf("YES\n");
            else
                printf("NO\n");
    
            C--;
        }
    
    
        return 0;
    }
    
    char *substring(char *string, int a, int b)
    {
        //문자열 string과 인덱스 a와 b를 받아 string[a]부터 string[b]까지로 이루어진 문자열을 반환
        //a < b
    
        char *substring;            //자른 문자열
        int i, j = 0;               //index
    
        substring = (char *)malloc(sizeof(char) * (b - a + 2));
    
        for (i = a; i <= b; i++)
        {
            substring[j] = string[i];
            j++;
        }
        substring[j] = '\0';
    
        return substring;
    }
    

    9년 전
1개의 댓글이 있습니다.
  • kcm1700
    kcm1700

    다른 얘긴데 malloc만 계속 하면서 free를 안 해주시면 메모리 릭 됩니다. 그러시면 안돼요.

    "닫는 괄호는 바로 다음이거나 맨 마지막." 왜 그렇게 생각하셨나요? 추측을 했으면 증명을 시도하하시거나 반례를 찾아보아야 합니다.

    ((())()) 의 경우 NO를 출력하는군요.


    9년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.