[백준] 4949번 균형잡힌 세상 (= balanced world) - 재우스 프로그래밍 (C 언어)

2021. 1. 30. 14:44백준

문제 링크 : www.acmicpc.net/problem/4949

stack에서 '(', '[' 만 push해주고 ')', ']'는 top에서 각각 '(', '['를 만났을 때만 pop해준다.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#define DEBUG 0
#define MAX_STRING_SIZE 100

typedef struct _stack {
    //문자열의 마지막에 NULL이 들어갈 자리때문에 +1
    char stackMem[MAX_STRING_SIZE + 1];
    int Top;
} stack;

bool empty(stack *);
void pop(stack *);
void push(stack *, char);
size_t size(stack *);
char top(stack *);
void initStack(stack *);
void initInputStr(char *);

int main(void)
{
    //모든 괄호 문자를 다루는 stack
    stack *st = (stack *)malloc(sizeof(stack));

    //input 한 줄 받을 문자열
    char inputStr[MAX_STRING_SIZE];
    int inputStrIdx = 0;
    //출력할 결과
    bool result = true;

    while(1) {

        initInputStr(inputStr);
        initStack(st);
        inputStrIdx = 0;    //index 초기화
        //input 한 줄 받아서 inputStr에 저장
        do {
            inputStr[inputStrIdx] = getchar();
        } while (inputStr[inputStrIdx++] != '.');
        //input buffer에서 개행 나올 때까지 비움
        while (getchar() != '\n') {}
#if DEBUG
        printf("inputStr: %s\n", inputStr);
#endif

        //'.' 하나만 들어왔을 때 반복문 종료
        if (!strcmp(inputStr, ".")) {
            break;
        }

        result = true;        //result 초기화
        for (int i = 0; i < (int)strlen(inputStr); i++) {
            //'('는 stack에 push
            if (inputStr[i] == '(') {
                push(st, inputStr[i]);
            }
            //'['는 stack에 push
            else if (inputStr[i] == '[') {
                push(st, inputStr[i]);
            }
            //')'는 stack의 top에 '('가 있으면 pop, 없으면 실패
            else if (inputStr[i] == ')') {
                if (top(st) != '(') {
                    result = false;
                    break;
                }
                pop(st);
            }
            //']'는 stack의 top에 '['가 있으면 pop, 없으면 실패
            else if (inputStr[i] == ']') {
                if (top(st) != '[') {
                    result = false;
                    break;
                }
                pop(st);
            }
        }
        //모든 괄호가 짝이 맞아서 stack이 전부 비워졌는지 검사
        if (!empty(st)) {
            result = false;
        }

        if (result) {
            printf("yes\n");
        }
        else {
            printf("no\n");
        }
    }

    free(st);
    return 0;
}

bool empty(stack *st)
{
    if (st->Top == -1) {
        return true;
    }
    else {
        return false;
    }
}
void pop(stack *st)
{
    if (!empty(st)) {
        st->stackMem[st->Top--] = '\0';
    }
    return;
}
void push(stack *st, char inputCh)
{
    //Top <= MAX_STRING_SIZE - 1 만족해야함
    if (st->Top < MAX_STRING_SIZE - 1) {
        st->stackMem[++st->Top] = inputCh;
    }
    return;
}
size_t size(stack *st)
{
    return (size_t)(st->Top + 1);
}
char top(stack *st)
{
    return st->stackMem[st->Top];
}
void initStack(stack *st)
{
    for (int i = 0; i < MAX_STRING_SIZE + 1; i++) {
        st->stackMem[i] = '\0';
    }
    st->Top = -1;
}
void initInputStr(char *inputStr)
{
    //inputStr 초기화
    for (int i = 0; i < MAX_STRING_SIZE; i++) {
        inputStr[i] = '\0';
    }
    return;
}