BRACKETS2 (괄호순서맞추기) 틀린케이스를 못찾겠어요. 도와주세요!

  • whalstn0202
    whalstn0202
    #include <stdio.h>
    #include <string.h>
    
    // 괄호 순서 맞나 안맞나 체크하는 함수.
    int check_matching(char bracket_arr[]);
    
    // 스택 관련 함수 1 : top에 위치한 괄호 하나를 삭제한다.
    char pop();
    
    // 스택 관련 함수 2 : top 위에 새로운 괄호 하나를 삽입함으로써 top++;
    void push(char bracket);
    
    char stack[10000];
    int top;
    
    int
    main()
    {
        int i;
        int cases;
        int result;
        char bracket_arr[10000] = { '0' };
    
        scanf("%d", &cases);
    
        for (i = 0; i < cases; i++) {
            scanf("%s", bracket_arr);
    
            result = check_matching(bracket_arr);
    
            bracket_arr[0] = '\0';      // bracket_arr 초기화.
    
            if (result == 1) {
                printf("YES\n");
            }
            else if (result == 0) {
                printf("NO\n");
            }
        }
    
        return 0;
    }
    
    int
    check_matching(char bracket_arr[])
    {
        int i;
        int left_round_brackets_count = 0;
        int right_round_brackets_count = 0;
        int left_curly_brackets_count = 0;
        int right_curly_brackets_count = 0;
        int left_square_brackets_count = 0;
        int right_square_brackets_count = 0;
    
        stack[0] = '\0';            // stack 초기화.
        top = 0;                    // top 초기화.
    
        // 첫 괄호가 오른쪽괄호면 NO!
        if (bracket_arr[0] == ')' ||
            bracket_arr[1] == '}' ||
            bracket_arr[2] == ']') {
            return 0;
        }
    
        // 일반적인 경우
        for (i = 0; i < strlen(bracket_arr); i++) {
            if (bracket_arr[i] == '(') {
                left_round_brackets_count++;
    
                push(bracket_arr[i]);
            }
            else if (bracket_arr[i] == '{') {
                left_curly_brackets_count++;
    
                push(bracket_arr[i]);
            }
            else if (bracket_arr[i] == '[') {
                left_square_brackets_count++;
    
                push(bracket_arr[i]);
            }
            else {
                if (bracket_arr[i] == ')') {
                    right_round_brackets_count++;
    
                    if (pop() != '(') {
                        return 0;
                    }
                }
                else if (bracket_arr[i] == '}') {
                    right_curly_brackets_count++;
    
                    if (pop() != '{') {
                        return 0;
                    }
                }
                else if (bracket_arr[i] == ']') {
                    right_square_brackets_count++;
    
                    if (pop() != '[') {
                        return 0;
                    }
                }
            }
        }
    
        // (((( 또는 {{{{ 또는 [[[[ 와 같이 한쪽 방향으로만 나오고 끝날수도있다. 이런 경우를 대비해야한다.
        if (left_round_brackets_count != right_round_brackets_count ||
            left_curly_brackets_count != right_curly_brackets_count ||
            left_square_brackets_count != right_square_brackets_count) {
            return 0;
        }
    
        return 1;
    }
    
    void
    push(char bracket)
    {
        stack[top++] = bracket;
    }
    
    char
    pop()
    {
        char pop_bracket;
    
        if (top == 0) {
            return 0;
        }
        else if (top > 0) {
            pop_bracket = stack[--top];
            stack[top] = '\0';
        }
    
        return pop_bracket;
    }
    

    8년 전
1개의 댓글이 있습니다.
  • draner
    draner

    문제를 잘 푸셨습니다. 다만... 실수하신게...
    // 첫 괄호가 오른쪽괄호면 NO!
    if (bracket_arr[0] == ')' ||
    bracket_arr[1] == '}' ||
    bracket_arr[2] == ']') {
    return 0;
    }

    라고하셧으면 
    
    // 첫 괄호가 오른쪽괄호면 NO!
    if (bracket_arr[0] == ')' ||
        bracket_arr[0] == '}' ||
        bracket_arr[0] == ']') {
        return 0;
    }
    
    으로해야 합니다.
    예제로 {[]} 가 들어간다면 2번인덱스에 ] 가 들어가므로   return 0  가 되서  false 이뜹니다.

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