[백준] 2504번 괄호의 값 (= value of parentheses) - 재우스 프로그래밍 (C 언어)

2021. 1. 31. 12:31백준

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

이렇게 변형했을 때 알 수 있는 사실은 여는 괄호( '(', '[' )가 들어오면 *2, *3을 해주다가 닫는 괄호가 나오는 순간 지금까지의 계산을 결과 값에 더해주는 방식으로 해석 할 수 있다.

기본적으로 주어진 1번식도 프로그램상 3번식처럼 계산할 수 있도록 알고리즘을 짠다. (괄호로 묶인 식을 무조건 풀어서 계산하는 것이라 생각하면 됨.)

아래는 문제의 예시 ( ( ) [ [ ] ] ) ( [ ] ) 에서 결과 28을 도출하는 과정

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

#define DEBUG 1
#define MAX_STACK_SIZE 30

typedef struct _stack {
    char mem[MAX_STACK_SIZE];
    int Top;
} stack;

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

int main(void)
{
    int temp = 1, result = 0;
    char inputStr[MAX_STACK_SIZE];
    stack *st = (stack *)malloc(sizeof(stack));

    scanf("%s", inputStr);

    initStack(st);
    for (int i = 0; i < (int)strlen(inputStr); i++) {
        //여는 괄호는 temp 값 증가
        if (inputStr[i] == '(') {
            push(st, inputStr[i]);
            temp *= 2;
        }
        //여는 괄호는 temp 값 증가
        else if (inputStr[i] == '[') {
            push(st, inputStr[i]);
            temp *= 3;
        }
        //닫는 괄호는 temp 값 감소
        else if (inputStr[i] == ')') {
            if (top(st) == '(') {
                pop(st);
            }
            //stack이 비어있으면 정상적이지 않은 문자열임.
            else {
                result = 0;
                break;
            }
            //처음 등장하는 닫는 괄호였을 때 reuslt 값 증가
            if (inputStr[i - 1] == '(') {
                result += temp;
            }
            temp /= 2;
        }
        //닫는 괄호는 temp 값 감소
        else if (inputStr[i] == ']') {
            if (top(st) == '[') {
                pop(st);
            }
            //stack이 비어있으면 정상적이지 않은 문자열임.
            else {
                result = 0;
                break;
            }
            //처음 등장하는 닫는 괄호였을 때 reuslt 값 증가
            if (inputStr[i - 1] == '[') {
                result += temp;
            }
            temp /= 3;
        }
    }
    if (!empty(st)) {
        result = 0;
    }

    printf("%d\n", result);

    free(st);
    return 0;
}

bool empty(stack *st)
{
    if (st->Top == -1) { return true; }
    else { return false; }
}
void pop(stack *st)
{
    st->mem[st->Top--] = '\0';
    return;
}
void push(stack *st, char inputCh)
{
    st->mem[++st->Top] = inputCh;
    return;
}
size_t size(stack *st) { return (size_t)(st->Top + 1); }
char top(stack *st) { return st->mem[st->Top]; }
void initStack(stack *st)
{
    for (int i = 0; i < MAX_STACK_SIZE; i++) {
        st->mem[i] = '\0';
    }
    st->Top = -1;
    return;
}