[백준] 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;
}
'백준' 카테고리의 다른 글
[백준] 2493번 탑 (= tower) - 재우스 프로그래밍 (C 언어) (0) | 2021.02.01 |
---|---|
[백준] 2504번 괄호의 값 (= value of parentheses) - 재우스 프로그래밍 (C 언어) (0) | 2021.01.31 |
[백준] 12865번 평범한 배낭 (= plain backpack) - 재우스 프로그래밍 (C 언어) (0) | 2021.01.30 |
[백준] 15954번 인형들 (= dolls) - 재우스 프로그래밍 (C 언어) (0) | 2021.01.30 |
[백준] 1967번 트리의 지름 (= tree diameter) - 재우스 프로그래밍 (C 언어) (0) | 2021.01.29 |