์ด๋ฒˆ์— ํ‘ผ ๋ฌธ์ œ๋Š” 20. Valid Parentheses ์˜€๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ์š”์•ฝํ•˜๋ฉด () , [], {} ์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ ๊ด„ํ˜ธ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ char array๊ฐ€ input์œผ๋กœ ๋“ค์–ด์˜ฌ๋•Œ ์ด ๊ด„ํ˜ธ๊ฐ€ ์œ ํšจํ•˜๊ฒŒ ๋ฐฐ์น˜๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

  • Open brackets must be closed by the same type of brackets.
  • Open brackets must be closed in the correct order.
  • Every close bracket has a corresponding open bracket of the same type.

์œ ํšจ์„ฑ์— ๋Œ€ํ•œ ์กฐ๊ฑด์€ ์œ„ ์„ธ๊ฐ€์ง€์ธ๋ฐ, ์˜ˆ๋ฅผ ๋“ค๋ฉด โ€œ()โ€ ์ด๊ฑด ์œ ํšจํ•˜์ง€๋งŒ โ€œ(]โ€, โ€œ(โ€œ, โ€œ)โ€ ์ด๊ฒƒ๋“ค์€ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์•„๋งˆ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์šด ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๊ต‰์žฅํžˆ ์นœ์ˆ™ํ•œ ๋ฌธ์ œ์ผ๊ฒƒ์ด๋‹ค.

๋‚˜๋„ ๋ณด์ž๋งˆ์ž โ€˜์Œ ์Šคํƒ๋ฌธ์ œ๊ตฐโ€™ ํ–ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ ์‹œ๋„ : Stack

์ •์„๋Œ€๋กœ ์Šคํƒ์„ ๊ตฌํ˜„ํ•ด์„œ ํ’€์—ˆ๋‹ค.

์ค‘๊ฐ„์— ๋ฌธ์ œ๋ฅผ ์ข€ ์˜คํ•ดํ•ด์„œ ์ด์ƒํ•˜๊ฒŒ ํ’€๊ธฐ๋„ ํ–ˆ์ง€๋งŒ ํ•˜์—ฌ๊ฐ„ ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š์€ ์Šคํƒ ๊ตฌํ˜„์ด์—ˆ๋‹ค.

typedef struct stack{
    char *arr;
    int top,size;
} Stack;


void init_stack(Stack* st, int size)
{
    char *new_arr = (char*)malloc(size);
    st->top = -1;
    st->size = size;
    st->arr = new_arr;
}

char pop(Stack* st)
{
    if(st->top<0) 
    {
        return '\0';
    }
    char *arr = st->arr;
    char res = arr[st->top--];
    return res;

}

bool push(Stack* st, char value){
    st->top++;
    if(st->top==st->size) return false;
    st->arr[st->top]= value;
    return true;
}

bool find(Stack *st1, char find)
{
    char* arr = st1->arr;
    if(st1->top>=0)
    {
        return find==pop(st1);
    }

    return false;

}


bool isValid(char* s) {
    Stack st;
    init_stack(&st,strlen(s)); //sizeof vs strlen

    for(int i=strlen(s)-1;i>-1;i--)
    {
        char c=s[i];
        bool res = true;
       switch(c)
        {
            case '(':
                res=find(&st,')');
                break;
            case '[':
                res=find(&st,']');
                break;
            case '{':
                res=find(&st,'}');
                break;
            default:
                res=push(&st,c);
        }
        if(!res) return false;
    }
    return st.top==-1;
    
}

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด์—ˆ๊ณ , ๊ณต๊ฐ„๋ณต์žก๋„๋„ O(n)์ด์—ˆ๋‹ค.

ํ†ต๊ณ„๋ฅผ ๋ณด๋‹ˆ ์ข€๋” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒƒ ๊ฐ™์•„์„œ ์•ฝ๊ฐ„ ๊ฐœ์„ ์„ ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐœ์„  : ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ•ด์ œ๐Ÿ˜…

์ง„์งœ ๋ฌด์Šจ ํ•œ ์‹œ๊ฐ„๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ค„์—ฌ๋ณด๋ ค๊ณ  ๋ณ„๊ฑธ ๋‹คํ–ˆ๋Š”๋ฐ ๊ทธ๋ƒฅ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ•ด์ œํ•˜๋Š”๊ฑธ ์žŠ์—ˆ๋‹ค..ใ…‹ใ…‹ใ…‹

์‚ฌ์‹ค ์ฝ”ํ‹€๋ฆฐ์ด๋‚˜ ํŒŒ์ด์ฌ๊ฐ™์€ high-level์˜ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์ด๋Ÿฐ ๋ถ€๋ถ„์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„์„œ ๊ฐ„๊ณผํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์ƒ๊ธด๊ฒƒ๊ฐ™๋‹ค.

์˜ค๋Š˜ ์‹œ๊ฐ„์€ ์ข€ ์ผ์ง€๋งŒ ๋•๋ถ„์— ๋‹ค์Œ์—๋Š” ์•ˆ์žŠ์–ด๋ฒ„๋ฆด๊ฒƒ ๊ฐ™๋‹ค.

#include <stdarg.h>

typedef struct stack{
    char *arr;
    int top,size;
} Stack;


void init_stack(Stack* st, int size)
{
    char *new_arr = (char*)malloc(size);
    st->top = -1;
    st->size = size;
    st->arr = new_arr;
}

char pop(Stack* st)
{
    if(st->top<0) 
    {
        return '\0';
    }
    char *arr = st->arr;
    char res = arr[st->top--];
    return res;

}

bool push(Stack* st, char value){
    if(st->top + 1==st->size) return false;
    st->arr[st->top++]= value;
    return true;
}

bool find(Stack *st1, char find)
{
    char* arr = st1->arr;
    if(st1->top>=0)
    {
        return find==pop(st1);
    }

    return false;

}


bool isValid(char* s) {
    Stack st;
    init_stack(&st,strlen(s)); //sizeof vs strlen

    for(int i=strlen(s)-1;i>-1;i--)
    {
        char c=s[i];
        bool res = true;
       switch(c)
        {
            case '(':
                res=find(&st,')');
                break;
            case '[':
                res=find(&st,']');
                break;
            case '{':
                res=find(&st,'}');
                break;
            default:
                res=push(&st,c);
        }
        if(!res) return false;
    }

    free(st.arr); // โ€ผ๏ธโ€ผ๏ธโ€ผ๏ธ
    return st.top==-1;
    
}

์˜ค๋žœ๋งŒ์— C๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด์„œ ๋Š๋ผ๋Š”๊ฑด๋ฐ ์ •๋ง ์žฌ๋ฐŒ๋Š” ์–ธ์–ด์ธ๊ฒƒ ๊ฐ™๋‹ค.

๋ชปํ•˜๋Š”๊ฒƒ๋„ ๋งŽ๊ณ  ๋ถˆํŽธํ•œ ๋ถ€๋ถ„์ด ๋งŽ์ง€๋งŒ ๊ทธ ๋ถ€๋ถ„์ด ์˜์™ธ๋กœ ์žฌ๋ฐŒ์–ด์ง€๋Š” ๋ถ€๋ถ„์ธ๊ฒƒ ๊ฐ™์•„์„œ ์š”์ฆ˜ ์ฆ๊ฒ๊ฒŒ ๊ณต๋ถ€ํ•˜๋Š” ์ค‘์ด๋‹ค.

์—ฌ๋Ÿฌ๋ชจ๋กœ ๋ฐ”๋น ์„œ ๊ณต๋ถ€ํ•˜๊ธฐ ํž˜๋“ค๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๊ณ„์† ์ž˜ ํ•ด๋ด์•ผ๊ฒ ๋‹ค๐Ÿ˜‚

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ