하루하루 꾸준히, 인생은 되는대로

자료구조

백준 11899번 C언어

긤효중 2021. 9. 19. 09:31

이번에도 괄호 문자열과 스택에 관한 문제이다. 전에 풀었던 4949번보다는 조금 더 생각할 거리가 없고 해서 쉬운 문제인 것 같다.

 

https://www.acmicpc.net/problem/11899

 

11899번: 괄호 끼워넣기

첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.

www.acmicpc.net

 

문제

심심한 승현이는 너무 심심한 나머지 올바른 괄호열을 가지고 놀고 있었습니다.

(()(()))()()

그러다가 어쩌다 보니 괄호열을 부러뜨렸습니다.

(() (( )))() ()

크게 낙담한 승현이는 노력해 보았지만, 대부분이 부러져 버려 단 한 부분만 재사용할 수 있다는 것을 깨닫게 되었습니다.

)))()

승현이는 이 괄호열을 가지고 놀려고 했으나 올바른 괄호열이 아니기 때문에 행복하지 않았습니다. 이를 보던 지학이는 승현이에게 “그러면 앞과 뒤에 적절하게 괄호를 붙이면 올바른 괄호열이 되지 않을까?”라고 했고, 승현이는 조금 생각한 뒤 그렇게 하기로 했습니다. 예를 들어, 위의 올바르지 않은 괄호열의 경우 앞에 여는 괄호 3개를 붙이면 올바른 괄호열이 됩니다.

((()))()

그러나 괄호열을 사서 붙이는 데에는 돈이 들고 많이 붙일수록 놀기가 불편해지기 때문에, 승현이는 가능한 한 괄호열을 적게 추가하려고 합니다.

승현이가 망가뜨리고 사용 가능한 올바르지 않은 괄호열이 주어질 때, 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 구하는 프로그램을 작성하세요.


 

입력

첫 번째 줄에 올바르지 않은 괄호열 S가 주어집니다. S의 길이는 1 이상 50 이하입니다.


 

출력

첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.


해결방안 -> 문자열 배열 하나를 입력받고 그 배열의 길이만큼 For문을 돌리면서 첫번쨰 시행에 배열이 비어있으므로 

Push연산을 하고 만약 스택의 제일 위에 있는 값이 ( 이고 배열의 값이 ) 이면 Pop연산을 한다.

그 외에는 모두 Push 연산을 한다.

반복문이 끝나고 스택의 제일 위에있는 topindex값을 출력한다.

 


전체소스코드

 

#include <stdio.h>

#include <string.h>

#define True 1

#define False 0

 

typedef struct _sstt{

    

    char arr[50];

    int topindex;

}stack;

 

typedef stack Stack;

 

void Stackinit(Stack *pstack){

    pstack->topindex = 0;

}

 

int Empty(Stack *pstack){

    if(pstack->topindex == -1){

        return True;

    }

    else

    {

        return False;

    }

}

 

char return_top(Stack *pstack){

    

    return pstack->arr[pstack->topindex];

    

}

 

int return_topindex(Stack *pstack){

    return pstack->topindex;

}

 

void Push(Stack *pstack,char data){

    

    pstack->topindex = pstack->topindex + 1;

    pstack->arr[pstack->topindex] = data;

    

}

 

void Pop(Stack *pstack){

    

    pstack->arr[pstack->topindex] = '\0';

    pstack->topindex = pstack->topindex - 1;

}

 

int main(void){

    Stack stack;

    Stackinit(&stack);

    char array[51];

    scanf("%s",array);

    int size = strlen(array);

    for(int i = 0;i<size;i++){

        if(i == 0){ //처음에 스택 비어있으니깐 push연산

            Push(&stack,array[i]);

        }

        else

        {

            if(return_top(&stack) == '(' && array[i] == ')'){

                Pop(&stack); //topindex가 ( 이고 배열의 값이 ) 이면 Pop연산

            }

            else

            {

                Push(&stack,array[i]); //그외에는 Push연산

            }

        }

    }

    int i = return_topindex(&stack);

    printf("%d",i); //topindex값 출력

}

'자료구조' 카테고리의 다른 글

백준 2822 C언어  (0) 2021.09.25
백준 2164번 c언어  (0) 2021.09.23
백준 4949번 C언어  (0) 2021.09.17
큐의 개념 + 백준 10845 C언어  (0) 2021.09.16
백준 20001번 c언어  (0) 2021.09.15