[백준] 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;
}
'백준' 카테고리의 다른 글
[백준] 2156번 포도주 시식 (= wine tasting) - 재우스 프로그래밍 (C 언어) (0) | 2021.02.03 |
---|---|
[백준] 2493번 탑 (= tower) - 재우스 프로그래밍 (C 언어) (0) | 2021.02.01 |
[백준] 4949번 균형잡힌 세상 (= balanced world) - 재우스 프로그래밍 (C 언어) (0) | 2021.01.30 |
[백준] 12865번 평범한 배낭 (= plain backpack) - 재우스 프로그래밍 (C 언어) (0) | 2021.01.30 |
[백준] 15954번 인형들 (= dolls) - 재우스 프로그래밍 (C 언어) (0) | 2021.01.30 |